lg1443马的遍历

来源:互联网 发布:日本清酒 知乎 编辑:程序博客网 时间:2024/06/05 11:20

题目描述

有一个n*m的棋盘
在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式

输入格式:
一行四个数据,棋盘的大小和马的坐标

输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

输入输出样例

输入样例#1: 复制
3 3 1 1
输出样例#1: 复制
0 3 2
3 -1 1
2 1 4

一直以为自己不会BFS的 尴尬了 BFS 的模板

#include<bits/stdc++.h>using namespace std;#define maxn 400+100int a[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};int c[maxn][maxn];bool fa[maxn][maxn];int m,n;struct ac{   int x,y;}b[maxn];queue<ac>q;void BFS(int sx,int sy){   ac w;   w.x=sx; w.y=sy;   q.push(w);   while(!q.empty()){      w=q.front();      q.pop();      for(int j=0;j<8;j++){         ac e=w;         e.x+=a[j][0];         e.y+=a[j][1];         if(e.x>n||e.y>m||e.x<1||e.y<1||fa[e.x][e.y])                continue;         c[e.x][e.y]=c[w.x][w.y]+1;         fa[e.x][e.y]=1;         q.push(e);      }   }}int main(){   int x,y;   cin>>n>>m>>x>>y;   memset(c,-1,sizeof(c));   memset(fa,0,sizeof(fa));   fa[x][y]=1;   c[x][y]=0;   BFS(x,y);   for(int j=1;j<=n;j++){     for(int k=1;k<=m;k++){       printf("%-5d",c[j][k]);     }     cout<<endl;   }   return 0;}