原题链接
用dfs爆搜即可
#include <iostream>
using namespace std;
const int N = 20;
int ans = 0;
bool st[N][N];
int n, m, a, b;
int dir[2][2] = {0, 1, 1, 0};
void dfs(int u, int x, int y) {
if (u == a + 1) {
ans ++;
return ;
}
for (int i = x; i < n; i ++)
for (int j = (i == x ? y : 0); j < m; j ++) {
if (!st[i][j]) {
st[i][j] = 1;
for (int k = 0; k < 2; k ++) {
int a = i + dir[k][0], b = j + dir[k][1];
if (a < 0 || a >= n || b < 0 || b >= m || st[a][b]) continue;
st[a][b] = 1;
if (j == m - 1)
dfs(u + 1, i + 1, 0);
else dfs(u + 1, i, j + 1);
st[a][b] = 0;
}
st[i][j] = 0;
}
}
}
int main() {
cin >> n >> m >> a >> b;
dfs(1, 0, 0);
cout << ans << endl;
return 0;
}