c++ dfs回溯
#include <bits/stdc++.h>
using namespace std;
const int N=15;
int n, m, sx, sy, t;
bool vis[N][N];
int ans, cnt;
const int dirs[8][2]={{2, 1}, {1, 2}, {-1, 2}, {-2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}};
void dfs(int x, int y){
vis[x][y]=true;
if(cnt==n*m) ans++;
for(int i=0; i<8; ++i){
int nx=x+dirs[i][0];
int ny=y+dirs[i][1];
if(0<=nx && nx<n && 0<=ny && ny<m && !vis[nx][ny]){
cnt++;
dfs(nx, ny);
vis[nx][ny]=false;
--cnt;
}
}
}
int main(){
cin>>t;
while(t--){
cin>>n>>m>>sx>>sy;
ans=0;
memset(vis, 0x00, sizeof vis);
cnt=1;
dfs(sx, sy);
cout<<ans<<endl;
}
return 0;
}