#include <bits/stdc++.h>
using namespace std;
int n, m, d[4][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}}, vis[20][20], ans;
void dfs(int x, int y) {
if (x == n && y == m) {
ans++;
return;
}
for (int i = 0; i < 4; i++) {
if (x + d[i][0] >= 0 && x + d[i][0] <= n && y + d[i][1] >= 0 && y + d[i][1] <= m && !vis[x + d[i][0]][y + d[i][1]]) {
vis[x + d[i][0]][y + d[i][1]] = true;
dfs(x + d[i][0], y + d[i][1]);
vis[x + d[i][0]][y + d[i][1]] = false;
}
}
}
int main() {
cin >> n >> m;
dfs(0, 0);
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, m, d[4][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}}, vis[20][20], ans;
void dfs(int x, int y) {
if (x == n && y == m) {
ans++;
return;
}
for (int i = 0; i < 4; i++) {
if (x + d[i][0] >= 0 && x + d[i][0] <= n && y + d[i][1] >= 0 && y + d[i][1] <= m && !vis[x + d[i][0]][y + d[i][1]]) {
// vis[x + d[i][0]][y + d[i][1]] = true;
dfs(x + d[i][0], y + d[i][1]);
// vis[x + d[i][0]][y + d[i][1]] = false;
}
}
}
int main() {
cin >> n >> m;
dfs(0, 0);
cout << ans;
return 0;
}
为什么第二段代码能AC第一段不能(我知道不必回溯,但不知道为什么不能回溯)