题目描述
给定一个 n×m 的二维矩阵,其中的每个元素都是一个[1,9] 之间的正整数。
从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走。
走了 k 次后,经过的元素会构成一个 (k+1) 位数。
请求出一共可以走出多少个不同的 (k+1) 位数。
输入格式
第一行包含三个整数 n,m,k。
接下来 n 行,每行包含 m 个空格隔开的整数,表示给定矩阵。
输出格式
输出一个整数,表示可以走出的不同 (k+1) 位数的个数。
数据范围
对于 30% 的数据, 1≤n,m≤2,0≤k≤2
对于 100%的数据,1≤n,m≤5,0≤k≤5,m×n>1
输入样例:
3 3 2
1 1 1
1 1 1
2 1 1
输出样例:
5
样例解释
一共有 5 种可能的 3 位数:
111
112
121
211
212
思路
25个数乘四的五次方种可能,直接爆搜,把搜出来的结果储存到哈希表里。
四个方向的搜索,可以往回走,两个循环枚举所有的位置为起点,写搜索的函数,根据每个起点x,y,走的步数,总和四个参数进行搜索和判断结束。
代码
#include<algorithm>
#include<cstring>
#include<iostream>
#include<unordered_set>
using namespace std;
const int N=10;
int n,m,k;
int w[N][N];
unordered_set<int> S;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//搜索的四个方向
void dfs(int x,int y,int u,int num)//x,y,步数,总和
{
if(u>k)S.insert(num);//如果步数够了就放入哈希表中
else
{
for(int i=0;i<4;i++)
{
int a=x+dx[i],b=y+dy[i];//向四个方向走
if(a>=0&&a<n&&b>=0&&b<m)//如果数组没越界,就向下走
{
dfs(a,b,u+1,num*10+w[a][b]);
}
}
}
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&w[i][j]);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
dfs(i,j,1,w[i][j]);
}
}
printf("%d\n",S.size());
return 0;
}