洛谷P1443 马的遍历
感叹!BFS模版好强大!突然感觉听起来很复杂的题,让计算机处理起来,妙啊!
这道题还让我学了点象棋的知识,嗯,学计算机的啥都得会
1、对我而言,感觉这道题的重点在于知道马是怎么移动的:先直着走,再斜着走,共8个方向
2、如果想给某个数组赋同样的值,不能直接={-1},那样只会给第一个元素赋值,应该借用memset函数。memset(ans, -1, sizeof(ans)):数组名,值,要填充的字节数
3、x对应n,y对应m
代码见下:
//象棋:走法是每步直一格再斜一格
//bfs
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
struct point{
int x,y;
};
queue<point> q;
int dx[8]={-2,-2,-1,-1,1,1,2,2};
int dy[8]={1,-1,2,-2,2,-2,1,-1};
//记录到每个位置最少要走的步数
int ans[405][405];
int main(){
// 将ans数组全部元素赋值为-1
memset(ans, -1, sizeof(ans));
cin>>n>>m>>x>>y;
ans[x][y]=0;
q.push({x,y});
while(!q.empty()){
point temp=q.front();
q.pop();
for(int i=0;i<8;i++){
int x=temp.x+dx[i];
int y=temp.y+dy[i];
// 判断边界以及该点是否走过,如果走过就不能再走
// x对应行,y对应列 例第一行的坐标应该是(1,1)(1,2)(1,3)
if(x<1||x>n||y<1||y>m||ans[x][y]!=-1) continue;
// 该点的步数就等于上一点的步数加1
ans[x][y]=ans[temp.x][temp.y]+1;
q.push({x,y});
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<ans[i][j]<<" ";
if(j==m) cout<<endl;
}
}
}

浙公网安备 33010602011771号