迷宫问题

来源:互联网 发布:牛仔外套品牌推荐知乎 编辑:程序博客网 时间:2024/05/01 23:38

pz要从迷宫的(1,1)处去到遥远的(m,n)处,因为那里有好多plmm,ta不在乎路线是不是最佳的,只在乎是不是有路能够追寻到mm,现ta给你这张迷宫的地图, 向你咨询mm是否只是可远观而不可&*%$#@。

#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int map[505][505];//迷宫布局;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//走的步数;
int used[505][505];//是否被使用;
int n,m;//n x m的地图;
int ok=0;//是否有通路;

typedef struct{
    int x,y;//地图坐标;
}M;

queue<M> q;//BFS的队列;

void BFS(int x,int y)/*开始位置;*/{
    M t,tt,ttt;//完成BFS的三个队列;
    t.x=x;t.y=y;//记录第一个,送入队列;
    used[x][y]=1;//标记为已使用;
    q.push(t);
    int xx,yy;//下一步BFS的位置……下面使用
    while(q.size()!=0)/*当队列不为空时*/{
        tt=q.front();//取出队头;
        if(tt.x==n && tt.y==m){//到达出口;
                ok=1;//可以;
                return;
            }
        q.pop();//否则清除,继续;
        for(int i=0;i<4;i++){//开始找与tt相邻的坐标;
            xx=tt.x+d[i][0];//横坐标;
            yy=tt.y+d[i][1];//纵坐标;
            if(map[xx][yy]==1 && !used[xx][yy]){//如果下个相邻位置为1,即可以通过,并且未被使用;
                ttt.x=xx;ttt.y=y;
                q.push(ttt);//送入队列;
                used[xx][yy]=1;//标记为使用;
            }
        }
    }
}

int main(){
    scanf("%d%d",&n,&m);//输入n x m的迷宫;
 for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%d",&map[i][j]);
        }
    BFS(1,1);//从出口开始找;
    if(ok==0)
        puts("No way");
    else
        puts("Bingo");
}

原创粉丝点击