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

A - Dungeon Master

时间:2020-01-22 22:23:14      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:escape   class   bfs   pre   nod   记录   names   sum   alt   

【题意】::士兵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++++++\n",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

标签:escape   class   bfs   pre   nod   记录   names   sum   alt   

原文地址:https://www.cnblogs.com/WGD943/p/12229471.html

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