【洛谷】P1443 马的遍历

题目描述

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

输入格式

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

输出格式

一个 n \times mn×m 的矩阵,代表马到达某个点最少要走几步(左对齐,宽 55 格,不能到达则输出 -11)。

输入输出样例

 

bfs板子

ac代码

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int meme[500][500];
int n,m;
struct yuu{
	int x,y,step;
};
queue<struct yuu> op;
void bfs(int x,int y,int step)
{
	if(x>=1&&x<=n&&y>=1&&y<=m&&meme[x][y]==-1)
	{
		struct yuu inp;
	    inp.step=step;inp.x=x;inp.y=y;
	    op.push(inp);
		meme[x][y]=step;	
	}
}
int main()
{
	for(int i=0;i<500;i++)
	   for(int j=0;j<500;j++)
	        meme[i][j]=-1;
	int x,y;
	cin>>n>>m>>x>>y;
	struct yuu inp;
	inp.step=0;inp.x=x;inp.y=y;
	meme[x][y]=0;
	op.push(inp);
	while(!op.empty())
	{
		inp=op.front();
		bfs(inp.x-1,inp.y-2,inp.step+1);
		bfs(inp.x-2,inp.y-1,inp.step+1);
		bfs(inp.x+1,inp.y+2,inp.step+1);
		bfs(inp.x+2,inp.y+1,inp.step+1);
		bfs(inp.x-1,inp.y+2,inp.step+1);
		bfs(inp.x-2,inp.y+1,inp.step+1);
		bfs(inp.x+1,inp.y-2,inp.step+1);
		bfs(inp.x+2,inp.y-1,inp.step+1);
		op.pop();
	}
	for(int i=1;i<=n;i++)
	{
	    for(int j=1;j<=m;j++)
	    printf("%-5d",meme[i][j]);
	    cout<<endl;
	}
	return 0;
}


累了毁灭吧

 

posted on 2022-03-10 23:09  zesure  阅读(132)  评论(0编辑  收藏  举报

导航