原题链接
思路:DFS
两层循环,将图中每个点都作为起始点,进行DFS,在DFS过程中记录下层数和形成的数的值,DFS进行k次后,将形成的数值插入哈希表,最后输出哈希表的大小即可。
(注意:因为题目说明走过的点可以再走,所以不需要记录状态。另外,因为unordered-set对于相同的值只能存一次,所以无需担心记录重复的路)
#include<iostream>
#include<unordered_set>
using namespace std;
const int N = 10;
int n,m,k;
int g[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 r)
{
if(u > k)
{
s.insert(r);
}
else{
for(int i = 0;i < 4;i ++)
{
int a = x + dx[i],b = y + dy[i];
if(a >= 1 && a <= n && b >= 1 && b <= m)
dfs(a,b,u + 1,r * 10 + g[a][b]);
}
}
}
int main()
{
cin >> n >> m >> k;
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= m;j ++)
{
cin >> g[i][j];
}
}
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= m;j ++)
{
dfs(i,j,1,g[i][j]);
}
}
cout << s.size() << endl;
return 0;
}