A - Dungeon Master

Posted wgd943

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A - Dungeon Master相关的知识,希望对你有一定的参考价值。

【题意】::士兵X要以最快的速度解救公主E(即路径最短),每运动一次时间增加一分钟;问公主是否能被解救,能则输出时间,不能则输出"Impossible";

【思路】::此题最大的难点在于三维空间,我开始没读懂题呢。一个3D的立体图形(类似于长方体),求在此条件下的最短路径,比平常做的平面多了一维,用普通的bfs求解即可。

技术图片
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
using namespace std;
char mp[35][35][35];
int  vis[35][35][35];
int l,r,c;
//3D空间,所以有六个方向。标记
int fx[6]={0,0,0,0,-1,1};
int fy[6]={0,-1,0,1,0,0};
int fz[6]={1,0,-1,0,0,0};

int answer;

struct node
{
    int x,y,z;
    int sum;//记录步数
};
//node e,now;
bool check(int x,int y,int z){
    if(x<l&&x>=0&&y<r&&y>=0&&z<c&&z>=0&&mp[x][y][z]!=#){
        //printf("%d %d %d++++++
",x,y,z);
        return 1;
    }
    return 0;
}
int  bfs(int x,int y,int z){
    queue<node> q;
    node now;
    q.push({x,y,z});
    now.sum=0;
    while(q.size()){
        now=q.front();
        q.pop();
        
        if(mp[now.x][now.y][now.z]==E){
        
        return now.sum; 
        } 
       for(int i=0;i<6;i++){         
                    node e;//对下一个进行标记
            e.x=now.x+fx[i];
            e.y=now.y+fy[i];
            e.z=now.z+fz[i];
        
            if(!vis[e.x][e.y][e.z]&&check(e.x,e.y,e.z)){//表示有路可走
                
                vis[e.x][e.y][e.z]=1;
                e.sum=now.sum+1;
                q.push(e);
            }
        
            
}

}
return -1;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int i,j,k;
    int si,sj,sk;
    while (cin>>l>>r>>c&&(l!=0||r!=0||c!=0))
    {
        memset(vis,0,sizeof(vis));
        for (i=0;i<l;i++)
            for (j=0;j<r;j++)
              for (k=0;k<c;k++)
          {
            cin>>mp[i][j][k];
            if (mp[i][j][k]==S)//记录当前士兵的位置
                {
                    si=i;
                    sj=j;
                    sk=k;
                }
          }
        
          answer=bfs(si,sj,sk);
          if (answer==-1)
            cout << "Trapped!" << endl;
          else
             cout << "Escaped in " << answer << " minute(s)." << endl;

    }
    return 0;
}
View Code

以上就是我的做法了,由于是新手,所以看到这道题我还是做了很久,但大体代码都是直接照搬模板的。。。

以上是关于A - Dungeon Master的主要内容,如果未能解决你的问题,请参考以下文章

A - Dungeon Master

POJ 2251 Dungeon Master

Dungeon Master

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

Dungeon Master 题解

POJ-2251-Dungeon Master