1. 题目来源
链接:3502. 不同路径数
2. 题目解析
一道简单题。
一看这数据范围,小的可怜,直接暴力做就行了。
一共走 5 步,每步四个方向,则一个起点会有
4
5
4^5
45 种走法,起点有
5
∗
5
=
25
5*5=25
5∗5=25 种走法,则总共也就只有 25600 种方案,直接 dfs
暴搜即可,每种方案数值长度最多是 6 位,所以总的计算量就是 15W
,左右。
前导零也不需要考虑,也不需要考虑每个点只能走一次的情况…简化了太多了。
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>
using namespace std;
const int N = 10;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int n, m, k;
int w[N][N];
unordered_set<int> S;
void dfs(int x, int y, int u, int res) {
if (u == k + 1) {
S.insert(res);
return ;
}
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) continue;
dfs(a, b, u + 1, res * 10 + w[a][b]);
}
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
scanf("%d", &w[i][j]);
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
dfs(i, j, 0, 0);
printf("%d\n", S.size());
return 0;
}