P1443 马的遍历

题目大意:

计算出马到达棋盘上任意一个点最少要走几步。

思路:

直接bfs搜索一遍就好了。

注意事项:

这道题有几个坑点:

  1. 数组要开大,不然会RE。
  2. 注意马行走的规则,马走日。
  3. 输出要左对齐,宽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("
");
    }
    return 0;//完美结束 
}
原文地址:https://www.cnblogs.com/shanxx/p/12893818.html