码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2157 Maze(bfs)

时间:2015-09-25 18:30:41      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

题意:有一个迷宫,迷宫里面有5种门,A,B,C,D,E,对应的钥匙分别在迷宫为a,b,c,d,e这些点上,

打开这些门分别需要对应的所有钥匙,例如在迷宫里面有A门挡住了去路,那么你需要找到迷宫里所有的a才能打开A门;

‘x’表示墙,‘.’表示通道,‘S’表示出发点,‘G’表示终点,可以到达终点输出YES,否则输出NO;

 

思路:在出发之前先判断下迷宫中有多少种门,然后判断是否可以打开(找到对应的所有钥匙),如果可以打开,

将对应的门变为‘.‘(通道),否则不改变(或者变为‘X’),然后再从S点走到G点;

寻找钥匙的过程可以用BFS搜索

代码如下:

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
//用结构体保存
struct Node{
    int x,y;
    int step;
};
Node start,end,A,B,C,D,E;
char map_[25][25];//保存迷宫
int m,n;
Node qa[425],qb[425],qc[425],qd[425],qe[425];//保存钥匙的位置
int ax[4]={-1,0,1,0};
int ay[4]={0,1,0,-1};
int vis[425][425];//标记数组
bool BFS(Node x){
    queue<Node> mq;
    while(!mq.empty()){
        mq.pop();
    }
    mq.push(start);
    vis[start.x][start.y]=1;
    while(!mq.empty()){
        Node no = mq.front();
        mq.pop();
        if(no.x==x.x&&no.y==x.y){
            return 1;
        }
        for(int i=0;i<4;i++){
            Node de = no;
            de.x = no.x+ax[i];
            de.y = no.y+ay[i];
            if(de.x>=0&&de.x<m&&de.y>=0&&de.y<n&&vis[de.x][de.y]==0&&map_[de.x][de.y]!=A
               &&map_[de.x][de.y]!=B&&map_[de.x][de.y]!=C&&map_[de.x][de.y]!=D&&map_[de.x][de.y]!=E
               &&map_[de.x][de.y]!=X){
                vis[de.x][de.y]=1;
                mq.push(de);
               }

        }
    }
    return 0;
}


int main()
{
    while(~scanf("%d%d",&m,&n)){
        if(m==0&&n==0)return 0;
        memset(map_,0,sizeof(map_));
        int ma=0,mb=0,mc=0,md=0,me=0;//用于记录对应点的数目
        for(int i=0;i<m;i++){//输入迷宫时,记录门的位置和钥匙的位置
            scanf("%s",map_[i]);
            for(int j=0;map_[i][j];j++){
                if(map_[i][j]==S){start.x = i;start.y=j;
                }else if(map_[i][j]==G){end.x = i;end.y=j;
                }else if(map_[i][j]==A){A.x=i;A.y=j;}
                else if(map_[i][j]==B){B.x=i;B.y=j;}
                else if(map_[i][j]==C){C.x=i;C.y=j;}
                else if(map_[i][j]==D){D.x=i;D.y=j;}
                else if(map_[i][j]==E){E.x=i;E.y=j;}
                if(map_[i][j]==a){
                    qa[ma].x=i;qa[ma++].y=j;
                }
                if(map_[i][j]==b){
                    qb[mb].x=i;qb[mb++].y=j;
                }
                if(map_[i][j]==c){
                    qc[mc].x=i;qb[mc++].y=j;
                }
                if(map_[i][j]==d){
                    qd[md].x=i;qd[md++].y=j;
                }
                if(map_[i][j]==e){
                    qe[me].x=i;qe[me++].y=j;
                }
            }
        }
        int sum=0;
        for(int i=0;i<ma;i++){
            memset(vis,0,sizeof(vis));//每次BFS后将标记数组还原,继续下次的BFS
            if(BFS(qa[i]))sum++;
            if(sum==ma){
                if(map_[A.x][A.y]==A)
                    map_[A.x][A.y]=.;
            }

        }
        sum=0;
        for(int i=0;i<mb;i++){

            memset(vis,0,sizeof(vis));
            if(BFS(qb[i]))sum++;
            if(sum==mb){
                if(map_[B.x][B.y]==B)
                    map_[B.x][B.y]=.;
            }
        }
        sum=0;
        for(int i=0;i<mc;i++){

            memset(vis,0,sizeof(vis));
            if(BFS(qc[i]))sum++;
            if(sum==mc){
                if(map_[C.x][C.y]==C)
                    map_[C.x][C.y]=.;
            }
        }
        sum=0;
        for(int i=0;i<md;i++){

            memset(vis,0,sizeof(vis));
            if(BFS(qd[i]))sum++;
            if(sum==md){
                if(map_[D.x][D.y]==D)
                    map_[D.x][D.y]=.;
            }
        }
        sum=0;
        for(int i=0;i<me;i++){

            memset(vis,0,sizeof(vis));
            if(BFS(qe[i]))sum++;
            if(sum==me){
                if(map_[E.x][E.y]==E)
                    map_[E.x][E.y]=.;
            }
        }
        memset(vis,0,sizeof(vis));
        if(BFS(end)){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}

 

poj 2157 Maze(bfs)

标签:

原文地址:http://www.cnblogs.com/hnzyyTl/p/4838542.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!