题目描述
有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n,m,x,y。
输出格式
一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。
输入输出样例
输入 #1
3 3 1 1输出 #1
0 3 2 3 -1 1 2 1 4
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤x≤n≤400,1≤y≤m≤400。
题目难度
普及-
参考思路
马有八个方向,存数组比if——if——if——if...好得多(见代码mx[ ],my[ ])
还有要注意n行m列,给的出发坐标先给的行!
再注意越界判断要在访问数组之前
PS:用到了iomanip头文件中的setw()
参考代码
#include<bits/stdc++.h>
using namespace std;
int b,e=2,a[410][410],pro[410*410][2],mx[8]={2,-2,2,-2,-1,1,-1,1},my[8]={1,1,-1,-1,2,2,-2,-2},n,m,x,y;
int main()
{
cin>>n>>m>>x>>y;
memset(a,0xff,sizeof(a));//初始值:-1
pro[1][0]=x,pro[1][1]=y,a[x][y]=0;
while(b++<e-1)//头端加1并判断
for(int i=0;i<8;i++)
{
int xx=pro[b][0]+mx[i],yy=pro[b][1]+my[i];//先求坐标判断后再用数组访问
if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[xx][yy]==-1)
pro[e][0]=xx,pro[e++][1]=yy,a[xx][yy]=a[pro[b][0]][pro[b][1]]+1;//添加到bfs数组尾端
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<left<<setw(5)<<a[i][j];//控制行距
cout<<endl;
}
return 0;
}