【洛谷】P1443 马的遍历
题目描述
有一个 n \times mn×m 的棋盘,在某个点 (x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n, m, x, yn,m,x,y。
输出格式
一个 n \times mn×m 的矩阵,代表马到达某个点最少要走几步(左对齐,宽 55 格,不能到达则输出 -1−1)。
输入输出样例
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;
}
累了毁灭吧