Dungeon Master([kuangbin带你飞]专题一 简单搜索)

题目大意:题目链接

给个多层的迷宫,求从起点到终点的最短路径,不能到达就输出Trapped!

解体思路:

bfs直接搜,没什么好说的,一开始忘记清空队列一只WA,果然我还是菜鸡



#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
	int x,y,z;
}no;
queue<node> q;
int ans=0;
const int maxn = 35;
char mp[maxn][maxn][maxn];
int xx[6] = {-1,1,0,0,0,0};
int yy[6] = {0,0,-1,1,0,0};
int zz[6] = {0,0,0,0,-1,1};
bool vis[maxn][maxn][maxn];
int len[maxn][maxn][maxn];
int l,r,c;
int bx,by,bz;



int bfs(){
    while(!q.empty()) q.pop();
	memset(vis,false,sizeof(vis));
	memset(len,0,sizeof(len));
    no.x=bx;
    no.y=by;
    no.z=bz;
    q.push(no);
    len[no.x][no.y][no.z]=0;
    while(!q.empty()){
        node no1=q.front();
        q.pop();
        for(int i=0;i<6;i++){
            int dx=no1.x+xx[i];
            int dy=no1.y+yy[i];
            int dz=no1.z+zz[i];

            if(!vis[dx][dy][dz] && (mp[dx][dy][dz]=='.' || mp[dx][dy][dz]=='E')
                && dx>=0 && dx <l && dy >= 0 && dy< r && dz >=0 && dz < c)
			{
            	
                vis[dx][dy][dz]=1;
                len[dx][dy][dz]=len[no1.x][no1.y][no1.z]+1;
                no.x=dx;
                no.y=dy;
                no.z=dz;
                q.push(no);
                if(mp[no.x][no.y][no.z]=='E')
                {
                    return len[no.x][no.y][no.z];
                }
            }
        }
    }
    return 0;


}




int main(int argc, char const *argv[])
{
	//freopen("t.txt","r",stdin);

	while(~scanf("%d%d%d",&l,&r,&c)){
		if(l==0 && r==0 && c==0) break;
		ans=0;

		for(int x=0;x<l;x++){
			for(int y=0;y<r;y++){
				for(int z=0;z<c;z++){
					cin>>mp[x][y][z];
					if(mp[x][y][z]=='S'){
						bx=x;by=y;bz=z;
					}
				}
			}
		}
		int ans=bfs();
		if(ans) printf("Escaped in %d minute(s).\n",ans);
		else printf("Trapped!\n");
	}
	return 0;
}



posted @ 2016-10-14 21:48  hong-ll  阅读(141)  评论(0编辑  收藏  举报