45 lines
1.4 KiB
C++
45 lines
1.4 KiB
C++
#include <iostream>
|
||
using namespace std;
|
||
|
||
int dfs(int i, int j, int visited[][10], int cnt, int m, int n) {
|
||
// 终止条件:当遍历到最后一个格子时,如果已经遍历了mn个格子,则符合条件,数量加1
|
||
if (i == m && j == n) {
|
||
if (cnt == m * n)
|
||
return 1;
|
||
else
|
||
return 0;
|
||
}
|
||
// 非终止条件,继续递归
|
||
int res = 0;
|
||
if (i > 1 and !visited[i - 2][j - 1]) {
|
||
visited[i - 2][j - 1] = 1;
|
||
res += dfs(i - 1, j, visited, cnt + 1, m, n);
|
||
visited[i - 2][j - 1] = 0;
|
||
}
|
||
if (j > 1 and !visited[i - 1][j - 2]) {
|
||
visited[i - 1][j - 2] = 1;
|
||
res += dfs(i, j - 1, visited, cnt + 1, m, n);
|
||
visited[i - 1][j - 2] = 0;
|
||
}
|
||
if (i < m and !visited[i][j - 1]) {
|
||
visited[i][j - 1] = 1;
|
||
res += dfs(i + 1, j, visited, cnt + 1, m, n);
|
||
visited[i][j - 1] = 0;
|
||
}
|
||
if (j < n and !visited[i - 1][j]) {
|
||
visited[i - 1][j] = 1;
|
||
res += dfs(i, j + 1, visited, cnt + 1, m, n);
|
||
visited[i - 1][j] = 0;
|
||
}
|
||
return res;
|
||
}
|
||
|
||
int main() {
|
||
int m, n;
|
||
cin >> m >> n;
|
||
int visited[m][10] = {0}; // 二维数组表示已经遍历的格子
|
||
visited[0][0] = 1;
|
||
int cnt = 1; // 已经遍历的格子数目
|
||
cout << dfs(1, 1, visited, cnt, m, n) << endl;
|
||
return 0;
|
||
} |