洛谷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;
		}
	}
}
posted @ 2025-04-03 17:47  夕瑶^  阅读(20)  评论(0)    收藏  举报