马的遍历
题目描述
有一个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
算法:宽搜
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=410; typedef pair<int,int> PII; queue<PII>q; int dis[N][N]; int dx[8]={-2,-1,-2,-1,1,2,1,2},dy[8]={-1,-2,1,2,-2,-1,2,1}; int g[N][N],n, m,a,b; void bfs(int a, int b){ memset(dis,-1,sizeof(dis)); dis[a][b]=0; q.push({a,b}); while(q.size()){ auto t=q.front(); q.pop(); for(int i=0;i<8;i++){ int x=t.first+dx[i],y=t.second+dy[i]; if(x>=0&&x<n&&y>=0&&y<m&&dis[x][y]==-1){ dis[x][y]=dis[t.first][t.second]+1; q.push({x,y}); } } } } int main(void){ cin>>n>>m>>a>>b; a--,b--; bfs(a,b); for(int i=0;i<n;i++){ for(int j=0;j<m;j++) printf("%-5d",dis[i][j]); cout<<endl; } return 0; }