P1443 马的遍历

原题目地址:https://www.luogu.org/problem/show?pid=1443
题目描述

题目描述

有一个n*m的棋盘(1m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

输入输出格式

输入格式:
一行四个数据,棋盘的大小和马的坐标

输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

输入输出样例

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

比较经典的BFS,再加一个记录步数的数组就可以了。

#include
using namespace std;
int n,m,sx,sy,cx[8]={1,1,2,2,-1,-1,-2,-2},cy[8]={2,-2,1,-1,2,-2,1,-1},s,a[401][401],l,r,b[401][401];
struct s
{
    int x;
    int y;
    int p;
}d[40001];
void bfs()
{
    d[0].x=sx;d[0].y=sy;d[0].p=0;a[sx][sy]=0;
    int t,w=1;
    while(t
    {
        for(int i=0;i<8;i++)
    {
        int xx=d[t].x+cx[i],yy=d[t].y+cy[i];
        if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==-1)
        {       a[xx][yy]=d[t].p+1;
              d[w].x=xx,d[w].y=yy,d[w].p=d[t].p+1,b[xx][yy]=d[t].p,w++;
        }
    }
        t++;
    }
}
int main()
{
    cin>>n>>m>>sx>>sy; 
    for(int i=1;i<=n;i++)
         for(int j=1;j<=m;j++)
                a[i][j]=-1;
                   bfs();
        for(int i=1;i<=n;i++)
         for(int j=1;j<=m;j++)
             j==m?printf("%-5d\n",a[i][j]):printf("%-5d",a[i][j]);

    return 0;
}

你可能感兴趣的:(搜索算法,洛谷题解,广度优先搜索)