洛谷P1443 马的遍历——标准广度优先搜索

洛谷P1443 马的遍历——标准广度优先搜索

Solution:

这是一道标准的广度优先搜索题目。我们知道,马在棋盘上是按“日”行走的,也就是有八个方向,我们沿着这八个方向广度优先搜索就可以了。
代码如下:

#include<iostream>
#include<queue>
#include<stdio.h>
#define MAX 500
using namespace std;

int mp[MAX][MAX];//棋盘
int steps[MAX][MAX];//步数数组
int visit[MAX][MAX];//访问数组
int dir[][2]={{1,2},{1,-2},{2,-1},{2,1},{-1,-2},{-1,2},{-2,-1},{-2,1}};
                    //八个方向
int n,m;//n为行数,m为列数

struct xy{
  int x;
  int y;
}node,top;//坐标

void bfs(int x,int y,int step){
  steps[x][y]=step;//开始的点的步数为0
  visit[x][y]=1;//访问开始的点
  queue<xy> q;//队列
  node.x=x;
  node.y=y;
  q.push(node);//将开始的点入队列
  while(!q.empty()){
    top=q.front();
    q.pop();//取出首节点
    for(int i=0;i<8;i++){
        int xx=top.x+dir[i][0];
        int yy=top.y+dir[i][1];
        if(xx<1||xx>n||yy<1||yy>m){//若越界,就继续往下一个方向搜索
            continue;
        }
        if(visit[xx][yy]==0){//若没有访问过,就访问该节点
            node.x=xx;
            node.y=yy;
            q.push(node);//进队列
            visit[xx][yy]=1;
            steps[xx][yy]=steps[top.x][top.y]+1;//步数加1
        }
    }
  }
}

int main(){
  int sx,sy;
  cin>>n>>m>>sx>>sy;
  for(int i=0;i<MAX;i++){//初始化visit和steps数组
    for(int j=0;j<MAX;j++){
        visit[i][j]=0;
        steps[i][j]=-1;
    }
  }
  bfs(sx,sy,0);//bfs
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
        printf("%-5d",steps[i][j]);//左对齐并占5个字符
    }
    cout<<endl;
  }
  return 0;
}