0
点赞
收藏
分享

微信扫一扫

标准的BFS: 马的遍历

i奇异 2022-04-16 阅读 71
c++bfs算法

题目描述

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

输入

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

输出

一个n*m的矩阵,同一行元素之间用空格分离。代表马到达某个点最少要走几步。不能到达则输出-1。

样例输入

3 3 1 1

样例输出

0 3 2
3 -1 1
2 1 4

分析

标准的BFS问题

#include <bits/stdc++.h>

using namespace std;
bool visited[500][500];//标记是否到过
const int xx[8] = {-2,-2,-1,-1,1,1,2,2};//马的横向移动
const int yy[8] = {-1,1,-2,2,2,-2,1,-1};//马的纵向移动
queue<pair<int,int>> que;
int ans[500][500];//答案

int main()
{
    int n,m,x,y;
    cin>>n>>m>>x>>y;
    memset(ans,-1,sizeof(ans));
    memset(visited,false,sizeof(visited));
    ans[x-1][y-1] = 0;
    visited[x-1][y-1] = true;
    que.push(make_pair(x-1,y-1));

    while(!que.empty()){
        int nx = que.front().first,ny = que.front().second;
        que.pop();

        for(int i = 0;i<8;i++){
            if(nx+xx[i]>=0
               &&nx+xx[i]<=n-1
               &&ny+yy[i]>=0
               &&ny+yy[i]<=m-1
               &&visited[nx+xx[i]][ny+yy[i]]==false){//判断是否越界和是否到过
                visited[nx+xx[i]][ny+yy[i]] = true;
                que.push(make_pair(nx+xx[i],ny+yy[i]));
                ans[nx+xx[i]][ny+yy[i]]= ans[nx][ny]+1;
            }
        }
    }
    for(int i = 0;i<n;i++){
        for(int j = 0;j<m;j++){
            cout<<ans[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

 

举报

相关推荐

0 条评论