C++ 代码
/*
有深度限制的dfs
dfs的深度可作参数传入 也自然有了递归结束的条件,递归结束将dfs"谱的曲"作为结果
"走过的位置可以重复走" 就不用做一个访问标记了
那如果构成的字符串相同如何去重 -- 用set即可,set中无重复元素
*/
#include<iostream>
#include<cstring>
#include<unordered_set>
using namespace std;
const int N = 7;
int g[N][N];
int n , m, k;
unordered_set<int> S;
int dx[] = {0, -1, 0 ,1}, dy[] = {1, 0 ,-1, 0};
//dfs(当前的位置, 当前走的步数(递归深度), 当前走出的数)
void dfs(int a, int b, int u, int num)
{
if(u == k)
{
S.insert(num);
return;
}
//走四方
for(int i = 0; i < 4; i++)
{
int x = a + dx[i], y = b + dy[i];
if(g[x][y] != -1)
{
//加上这个数
int t = num * 10 + g[x][y];
dfs(x, y , u + 1, t);
}
}
}
int main()
{
memset(g, -1, sizeof(g));//用于判越界
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &g[i][j]);
//任意位置出发
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
dfs(i, j ,0, g[i][j]);
cout << S.size() << endl;
}