P1443 马的遍历

大致题意:

  • 计算出在某个点上的马走到其他点上最少要走几步,
  • 走不到的点标记为-1,走到的点标记为最少的步数,
  • 马走“日”字。

基本思路

  • 嗯…直接bfs一波带走就好了。
  • 从原点走“日”字,到一处若没有被标记则标记上,
  • bfs完的时候若是发现此点没有被标记就标记为-1。

Code:

//还是远古时期的码风...见谅
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
queue<int> a,b,step;
int n,m;
int k[410][410];
int pd[410][410];
int ax,ay;
int dx[8]={-2,-2,-1,-1,1,1,2,2};//若(x,y)为现在马所在的点,
int dy[8]={-1,1,-2,2,-2,2,-1,1};//则(x+dx[0~7],y+dy[0~7])为现在马能去的点
void bfs(int idx,int idy){//还是bfs的基础模板啊啊啊
    a.push(idx);
    b.push(idy);
    step.push(0);//进队列
    pd[idx][idy]=1;//标记原点已经来过
    while(!a.empty()){
        for(int i=0;i<8;++i){//便利能去的点
            int x=a.front()+dx[i];//记录能去的点
            int y=b.front()+dy[i];
            int step_=step.front();//记录去那个点要花的步数
            if(pd[x][y]==0){//若那个点没去过
                if(x>=0&&x<n&&y>=0&&y<m){//且若那个点没有超出边界
                    a.push(x);
                    b.push(y);
                    step.push(step_+1);//进队列
                    k[x][y]=step_+1;//记录步数
                    pd[x][y]=1;//标记来过
                }
            }
        }
        a.pop();
        b.pop();
        step.pop();//出队列
    }
}
int main(){
    cin>>n>>m>>ax>>ay;
    bfs(--ax,--ay);
    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j){
            if(k[i][j]==0)k[i][j]=-1;
        }
    }//找出没有去过的点标记为-1
    k[ax][ay]=0;//原点不能是-1,再标记回来
    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j){
            printf("%-5d",k[i][j]);
        }
        printf("
");
    }//输出
    return 0;
}
原文地址:https://www.cnblogs.com/FUXyao/p/12885403.html