题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入
一行四个数据,棋盘的大小和马的坐标
输出
一个n*m的矩阵,同一行元素之间用空格分离。代表马到达某个点最少要走几步。不能到达则输出-1。
样例输入
3 3 1 1
样例输出
0 3 2
3 -1 1
2 1 4
分析
标准的BFS问题
#include <bits/stdc++.h>
using namespace std;
bool visited[500][500];//标记是否到过
const int xx[8] = {-2,-2,-1,-1,1,1,2,2};//马的横向移动
const int yy[8] = {-1,1,-2,2,2,-2,1,-1};//马的纵向移动
queue<pair<int,int>> que;
int ans[500][500];//答案
int main()
{
int n,m,x,y;
cin>>n>>m>>x>>y;
memset(ans,-1,sizeof(ans));
memset(visited,false,sizeof(visited));
ans[x-1][y-1] = 0;
visited[x-1][y-1] = true;
que.push(make_pair(x-1,y-1));
while(!que.empty()){
int nx = que.front().first,ny = que.front().second;
que.pop();
for(int i = 0;i<8;i++){
if(nx+xx[i]>=0
&&nx+xx[i]<=n-1
&&ny+yy[i]>=0
&&ny+yy[i]<=m-1
&&visited[nx+xx[i]][ny+yy[i]]==false){//判断是否越界和是否到过
visited[nx+xx[i]][ny+yy[i]] = true;
que.push(make_pair(nx+xx[i],ny+yy[i]));
ans[nx+xx[i]][ny+yy[i]]= ans[nx][ny]+1;
}
}
}
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}