【洛谷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; }
标签:遍历,洛谷,P1443,int,样例,405,step,格式,步数 来源: https://www.cnblogs.com/gongcheng456/p/11022036.html