洛谷——P1443 马的遍历

题目描述

有一个n*m的棋盘(1

输入格式

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

输出格式

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

输入输出样例

输入 #1
3 3 1 1
输出 #1
0 3 2
3 -1 1
2 1 4

裸bfs,套个模板就好了

#include
using namespace std;
#define ll long long
int next1[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};//8个方位 
int n,m,x,y;
int s[405][405];
bool judge(int i,int j)
{
	return (i>=1&&j>=1&&i<=n&&j<=m);	
} 
struct node
{
	int xx;
	int yy;
};
void bfs()
{
	queue<node>que;
	s[x][y]=0;
	que.push((node){x,y});
	while(!que.empty())
	{
		node p=que.front();
		que.pop();
		for(int i=0;i<8;i++)
		{
			int nx=next1[i][0]+p.xx;
			int ny=next1[i][1]+p.yy;
			if(judge(nx,ny)&&s[nx][ny]==-1)
			{
				que.push((node){nx,ny});	
				s[nx][ny]=s[p.xx][p.yy]+1;
			}
		}
	}
	
	return ;
}
int main()
{
    cin>>n>>m;
	cin>>x>>y;	
	memset(s,-1,sizeof(s));
	bfs();
	for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=m;j++)
		{
			printf("%-5d",s[i][j]);// 输出左对齐,宽5格
		} 
		cout<<endl;
	}
    
    return 0;
}```

你可能感兴趣的:(洛谷——P1443 马的遍历)