有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
3 3 1 1
0 3 2 3 -1 1 2 1 4
本次带来一道广搜题,P1443 马的遍历。解这道题要用到BFS队列和二维数组的方法。将点以此读入进队列,达到最优步数的解。
记得注意结构体数组的大小,会出现运行错误(RE)。
#include<iostream>
using namespace std;
struct h
{
int x,y;
}a[160000];
int f=0,r=1,d[401][401],n,m,x1,y1;
int b[16]={2,-2,2,-2,-1,1,-1,1},c[16]={1,1,-1,-1,2,2,-2,-2};//控制方向的数组
int main()
{
cin>>n>>m>>x1>>y1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
d[i][j]=-1;
}
}
d[x1][y1]=0;//初始点入队
a[1].x=x1;
a[1].y=y1;
while(f<r)
{
f++;
int s=d[a[f].x][a[f].y]+1;//新点入队前的最优步数
for(i=0;i<8;i++)
{
int x2=a[f].x+b[i],y2=a[f].y+c[i];
if(x2>=1&&x2<=n&&y2>=1&&y2<=m&&d[x2][y2]==-1)//判断棋盘边界及此点是否被遍历
{
r++;
a[r].x=x2;//新点入队
a[r].y=y2;//新点入队
d[x2][y2]=s;//标记步数
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf("%-5d",d[i][j]);
}
cout<<endl;
}
return 0;
}