题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入样例#1:3 3 1 1
输出样例#1:
0 3 2
3 -1 1
2 1 4
BFS题,遍历一下所有的位置
#include<iostream>
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
int vis[410][410];
int stemp[410][410];
int i,j,a,b;
int dir[8][2]={1,2,1,-2,2,1,2,-1,-2,-1,-2,1,-1,2,-1,-2};
int check(int x,int y){
if(x<1||x>a||y<1||y>b||vis[x][y]==1)
return 1;
return 0;
}
struct ma{
int x,y;
};
void bfs(int x,int y){
memset(stemp,-1,sizeof(stemp));
queue<ma>q;
stemp[x][y]=0;
vis[x][y]=1;
q.push({x,y});
while(!q.empty()){
x=q.front().x,y=q.front().y;
q.pop();
int xx,yy;
for(i=0;i<8;i++){
xx=x+dir[i][0];
yy=y+dir[i][1];
if(check(xx,yy))continue;
stemp[xx][yy]=stemp[x][y]+1;
q.push({xx,yy});
vis[xx][yy]=1;
}
}
}
int main(){
int c,d;
cin>>a>>b>>c>>d;
bfs(c,d);
for(i=1;i<=a;i++,cout<<endl)
for(j=1;j<=b;j++)
printf("%-5d",stemp[i][j]);
return 0;
}