洛谷P1443 马的遍历
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
3 3 1 1
0 3 2 3 -1 1 2 1 4
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct wjz{
  int x,y,d;
};
int ans[410][410];
bool vis[410][410];
int dx[8]={1,2,-1,-2,1,2,-1,-2};
int dy[8]={2,1,2,1,-2,-1,-2,-1};
queue<wjz> Q;
wjz w;
int main()
{
    memset(ans,-1,sizeof(ans));
    int m,n,a,b;
    cin>>n>>m>>a>>b;
    ans[a][b]=0;
    vis[a][b]=1;
    Q.push((wjz){a,b,0});
    while(!Q.empty())
    {
      w=Q.front();
      Q.pop();
      for(int i=0;i<=7;i++)
      {
            int ax=w.x+dx[i],ay=w.y+dy[i];
            if(ax>=1&&ax<=n&&ay>=1&&ay<=m&&vis[ax][ay]==0)
            {
                Q.push((wjz){ax,ay,w.d+1});
                ans[ax][ay]=w.d+1;
                vis[ax][ay]=1;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
    printf("%-5d",ans[i][j]);
    cout<<endl;
    }
    return 0;
}
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号