【正经题解】马走日DFS
2026-08-21 17:38:57
发布于:江苏
1阅读
0回复
0点赞
**这题我们可以把每一次的测试数据放到一个专门函数里实现DFS正常,在编一个horse函数,这里直接上代码了,有注释
**
#include <bits/stdc++.h>
using namespace std;
int n,m,xi,yi;
int t;
bool vis[15][15];
int ans=0;
int dx[8] = {-2,-1,1,2,2,1,-1,-2};
int dy[8] = {-1,-2,-2,-1,1,2,2,1};
bool check(){//判断所有点是否全部被标记
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(vis[i][j]==false)return false;
}
}
return true;
}
void dfs(int x,int y){
if(check()){//如果符合条件
ans++;//ans累加
return;
}
for(int i=0;i<8;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<0||nx>=n||ny<0||ny>=m||vis[nx][ny])continue;//判断是否出界以及走过
vis[nx][ny]=true;//标记已走过
dfs(nx,ny);//递归深搜
vis[nx][ny]=false;//回溯
}
}
void horse(){
cin>>n>>m>>xi>>yi;
//将ans初始化为0
ans=0;
//vis全部初始化为未标记
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
vis[i][j]=false;
}
}
vis[xi][yi]=true;//将起点标记
dfs(xi,yi);
cout<<ans<<endl;
}
//下面就是main不用多说了吧
int main(){
cin>>t;
while(t--){
horse();
}
return 0;
}
这里空空如也



有帮助,赞一个