P1443 马的遍历
题目大意:
计算出马到达棋盘上任意一个点最少要走几步。
思路:
直接bfs搜索一遍就好了。
注意事项:
这道题有几个坑点:
- 数组要开大,不然会RE。
- 注意马行走的规则,马走日。
- 输出要左对齐,宽5格。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue> using namespace std; struct Node{ int x;// 马的x坐标 int y;// 马的y坐标 int sum;//记录步数 }que[101000];//数组模拟队列,由于本人不是很喜欢STL的队列,所以就用数组模拟了 long long n,m,mx,my;//棋盘大小,和初始马的坐标 long long dx[8]={-2,-2,-1,-1,1,1,2,2};//马可以走到的8个方向 long long dy[8]={1,-1,2,-2,2,-2,1,-1};//不知道马怎么走的同学可以去百度,记住马走日就好了 long long ans[501][501];//记录答案的数组 long long book[501][501];//记录重复的数组 void bfs(int n,int m,int mx,int my){ int head=1,tail=2;//头和尾 que[1].x=mx;//马的初始坐标 que[1].y=my;//马的初始坐标 ans[mx][my]=0;//马所在的位置所用的步数为零 book[mx][my]=1;//标记 while(head<tail){ for(int i=0;i<8;i++){//搜索8个点 int idx=que[head].x+dx[i];//计算马所在的位置 int idy=que[head].y+dy[i];//同理 if(idx>0&&idx<=n&&idy>0&&idy<=m&&book[idx][idy]==0){//判断是否越界,是否来过 book[idx][idy]=1;//标记为来过 que[tail].x=idx;//更新马的x坐标 que[tail].y=idy;//更新马的y坐标 que[tail].sum=que[head].sum+1;//更新步数 ans[idx][idy]=que[tail].sum;//记录步数 tail++;//尾++,这里相当于出栈 } } head++;//头++,这里相当于入栈 } } int main(){ scanf("%lld%lld%lld%lld",&n,&m,&mx,&my);//输入 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ans[i][j]=-1;//让答案的初始值为-1 } } bfs(n,m,mx,my);//搜索 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%-5lld",ans[i][j]);//输出要注意,左对齐,宽5格 } printf("\n"); } return 0;//完美结束 }