马的遍历

题目描述

有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

输入格式

一行四个数据,棋盘的大小和马的坐标

输出格式

一个n*m的矩阵,代表马到达某个点最少要走几步(不能到达则输出-1)

样例

样例输入

3 3 1 1

样例输出

0 3 2    
3 -1 1    
2 1 4  

c++AC代码

#include<bits/stdc++.h>
using namespace std;
bool flag[1005][1005];
int n,m,x,y,a[1005][1005];
int dir[8][2]={{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1}};
struct node{
    int x,y;
}t1,t2;
inline void bfs(int x,int y){
    queue<node> q;
    t1.x=x,t1.y=y;
    flag[x][y]=true;
    q.push(t1);
    while(!q.empty()){  
        t1=q.front();
        q.pop();
        for(int i=0;i<=7;i++){
            int dx=t1.x+dir[i][0],dy=t1.y+dir[i][1];
            if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!flag[dx][dy]){
                t2.x=dx,t2.y=dy;
                flag[dx][dy]=true;
                a[dx][dy]=a[t1.x][t1.y]+1;
                q.push(t2);         
            }
        }   
    }   
}
int main(){
    memset(a,-1,sizeof(a));
    cin>>n>>m>>x>>y;
    a[x][y]=0;
    bfs(x,y);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){  
            cout<<a[i][j]<<" ";
        }
        cout<<endl; 
    }
    return 0;
posted @ 2021-02-26 22:02  黄逸飞重庆八中  阅读(105)  评论(0编辑  收藏  举报