|
|
#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;
|
|
|
} |