orzchy

洛谷P1443 马的遍历

https://www.luogu.org/problemnew/show/P1443

很经典的搜索题了,蒟蒻用广搜打的

不说了,上代码!

#include<bits/stdc++.h>
using namespace std;
struct xy {//定义结构体
    int x,y;//x,y两个方向
} node,Top;
int dx[8]={2,-2,2,-2,-1,1,-1,1};
int dy[8]={1,1,-1,-1,2,2,-2,-2};//马走的八个方向
int a[401][401];
bool b[401][401];
int n,m;
void bfs(int x,int y,int step) {//广搜函数
    a[x][y]=step;
    b[x][y]=false;
    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 newx=Top.x+dx[i];
            int newy=Top.y+dy[i];//往八个方向遍历
            if (newx<1||newx>n||newy<1||newy>m) continue;//判断是否越界
            if (b[newx][newy]){//如果该点没有标记过 
                node.x=newx;
                node.y=newy;//更新
                q.push(node);//入队
                b[newx][newy]=false;//标记
                a[newx][newy]=a[Top.x][Top.y]+1;//步数+1
            }
        }
    }
}
int main() {
    memset(b,true,sizeof(b));
    memset(a,-1,sizeof(a));//数组初始化
    int x,y;
    cin>>n>>m>>x>>y;//输入
    bfs(x,y,0);//广搜
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=m; j++)
            printf("%-5d", a[i][j]);//输出五位常宽
        cout<<endl;//换行
    }
    return 0;
}

 

posted on 2019-04-12 22:42  orzchy  阅读(102)  评论(0编辑  收藏  举报

导航