题目描述:
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
样例输入:
3 3 1 1
样例输出:
0 3 2
3 -1 1
2 1 4
AC Code:
#include<bits/stdc++.h>
using namespace std;
const int N=401;//棋盘大小
struct node {//定义结构体
int x,y;//分别存储队列在该位置的横纵坐标
}que[N*N];
int vis[N][N];//该数组存储到达每个点的步数
int dx[]={-1,-2,-2,-1,1,2,2,1};//马为中心,可以扩展出8个点
int dy[]={2,1,-1,-2,-2,-1,1,2};//即8个方向
int main() {
int n,m,sx,sy,head,tail;
scanf("%d %d %d %d",&n,&m,&sx,&sy);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
vis[i][j]=-1;//全部初始化为-1
}
}
vis[sx][sy]=0;//起始点,显然需要0步
head=tail=1;//队头队尾初始化
que[head].x=sx;//起始点入队
que[head].y=sy;
tail++;//起始点入队,队尾向后移动一格
while(head<tail) {
int s=vis[que[head].x][que[head].y]+1;//扩展到下一个点的步数,对应第33行的代码语句
for(int i=0;i<8;i++) {//8个方向搜索
int tx=que[head].x+dx[i];
int ty=que[head].y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&vis[tx][ty]==-1) {
//没有走出棋盘且这个点没有走过
que[tail].x=tx;//新的点入队
que[tail].y=ty;
tail++;//同时队尾向后移动一格
vis[tx][ty]=s;//由上一个点扩展到该点,步数加1,对应第24行的代码语句
}
}
head++;//队头向后移动一格,搜索下一个点
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
printf("%-5d",vis[i][j]);//注意格式,左对齐,占5列
}
printf("\n");
}
return 0;
}