马的遍历

题目描述:

 

有一个n×m 的棋盘,在某个点 (x, y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入

输入只有一行四个整数,分别为 n, m, x, y。

输出

一个n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出−1)。

样例输入
3 3 1 1
样例输出
0    3    2    
3    -1   1    
2    1    4

解决过程:

设置一个二维数组用来记录最小步数
再用一个队列来实现广度优先搜索(基操勿六):设置一个队列,不断从队首按入,从队尾弹出,也可以运用一个数组(tail&&head)
#include<bits/stdc++.h>
int n,m,nx,ny;
int res[405][405];
int x[8]={1,2,-1,-2,-1,-2,1,2};
int y[8]={2,1,2,1,-2,-1,-2,-1};
struct queee{
    int x,y;
}a[160010];
void bfs(int,int);
int main()
{
    scanf("%d%d%d%d",&n,&m,&nx,&ny);
    memset(res,-1,sizeof res);
    bfs(nx,ny);
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            printf("%-5d",res[i][j]);
        printf("\n");
    }
    return 0;
}
void bfs(int i,int j)
{
    int head=1,tail=2;
    a[2].x=i,a[2].y=j;
    res[i][j]=0;//初始位置的最小步为0;
    while(head<tail)
    {
        head++;
        for(int q=0;q<8;q++)
        {
            //(xx,yy)表示目前马走到的位置。
            int xx=a[head].x+x[q];
            int yy=a[head].y+y[q];
            
            if((res[xx][yy]==-1)&&(xx>=1)&&(xx<=n)&&(yy>=1)&&(yy<=m))//判断是否走过        
            {
                tail++;
                res[xx][yy]=res[a[head].x][a[head].y]+1;//最小步数加一
                a[tail].x=xx;
                a[tail].y=yy; 
            }
        }
     } 
}

但是我调试了好久,码学堂上的题始终没有AC

仍有一部分WA,不过WA是wonderful answer(确实)(自我安慰)(帅)

 

 

 

发布后的第二天,李思远说是队列开小了,我调试成160000然后发现果然通过了((^-^)V)

posted @ 2022-08-24 20:42  董苏铭  阅读(99)  评论(0编辑  收藏  举报