HORSE的遍历
2026-08-20 22:59:30
发布于:江苏
3阅读
0回复
0点赞
从初始位置开始搜索,建立方向数组dx,dy,判断是否出界以及走过,再来个特判如果该值原先未被赋值就直接把当前步数赋值,否则和原来的进行比较取较小值
#include <bits/stdc++.h>
using namespace std;
struct node{
int x,y,step;
};
bool vis[401][401];
int ans[401][401];
int dx[8] = {-2,-1,1,2,2,1,-1,-2};
int dy[8] = {-1,-2,-2,-1,1,2,2,1};
int n,m,xi,yi;
void bfs(){
queue <node> q;
q.push({xi,yi,0});//将起点加入队列,并将步数设为0(方便以后计算步数)
vis[xi][yi]=true;//标记已走过
ans[xi][yi]=0;//将起点答案设为0
while(q.size()){
node t=q.front();
q.pop();
for(int i=0;i<8;i++){
//遍历方向
int nx=t.x+dx[i];
int ny=t.y+dy[i];
//判断是否出界和是否走过
if(nx<1||nx>n||ny<1||ny>m||vis[nx][ny])continue;
vis[nx][ny]=true;//标记
if(ans[nx][ny]==-1){//如果该点的值为-1(这个点先前没有被赋值答案)
ans[nx][ny]=t.step+1;
q.push(node{nx,ny,t.step+1});
}
else{//代表之前这个点被赋值了答案
ans[nx][ny]=min(ans[nx][ny],t.step+1);//与原先答案对比取较小值
q.push(node{nx,ny,t.step+1});
}
}
}
}
int main(){
cin>>n>>m>>xi>>yi;
//将ans初始全部初始化为-1
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans[i][j]=-1;
}
}
bfs();
//输出ans
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<ans[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
这里空空如也



有帮助,赞一个