【洛谷P1443 马的遍历】

题目链接(%%%jyy大佬)

题目描述

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

输入输出格式

输入格式:

一行四个数据,棋盘的大小和马的坐标

输出格式:

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

输入输出样例

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

主要是BFS的思想(毕竟是BFS经典题QwQ)
我们直接通过注释来理解叭
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node//我们不妨先设一个结构体
{
    int x,y,step;//设坐标以及步数 
    node(int x,int y,int step):x(x),y(y),step(step){};//构造函数,可以进行赋值操作 
};
queue<node> q;
int sx,sy;//当前的步数 
int mx[9]={0,-2,-1,1,2,2,1,-1,-2};//横坐标的移动 
int my[9]={0,-1,-2,-2,-1,1,2,2,1};//纵坐标的移动 
int st[405][405];//该点走到需要花费的步数  
bool check(int x,int y)//判断是否出界 
{
    return ((1<=x&&x<=n)&&(1<=y&&y<=m));
}
bool used[405][405];
void bfs()//笨法师 
{
    used[sx][sy]=1;//标记已经走过  
    q.push(node(sx,sy,0));//入队 
    st[sx][sy]=0;//初始化 
    while(!q.empty())//队列非空 (直至非空) 
    {
        node u=q.front();//取队首 
        q.pop();//出队 
        for(int i=1;i<=8;i++)//各种情况进行遍历 
        {
            int nx=u.x+mx[i];//下一步 (横坐标) 
            int ny=u.y+my[i];//下一步 (纵坐标) 
            if(check(nx,ny)&&!used[nx][ny])//判断这个点是否在界内并且是否被走过 
            {
                used[nx][ny]=1;//标记走过 
                st[nx][ny]=u.step+1;//step(步数)+1 
                q.push(node(nx,ny,u.step+1));//继续入队 
            }
        }
    }
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&sx,&sy);//日常输入 
    bfs();//进行广搜操作 
    for(int i=1;i<=n;i++)//print操作 
    {
        for(int j=1;j<=m;j++)
        {
            if(!used[i][j])
                printf("%-5d",-1);//控制位数,输出无解 
            else
                printf("%-5d",st[i][j]);//控制位数
        }
        puts("");//换行 
    }
    return 0;
}

 

posted @ 2019-06-14 10:29  卍GC卐  阅读(144)  评论(0编辑  收藏  举报