Zerojudge c124

首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信zhuastor@gmail.com

解題心得

這題是我突然想刷BFS題目的時候,就上Zerojudge打BFS然後找到的一題
一開始我怎麼都看不懂題目在說什麼,直到我想到一種可能性,那就是層跟層之間的點是互通的
一瞬間我覺得這題好玩到爆炸,真的超好玩,寫了好多經典BFS題目,才想到也有這種走法
這題不難,用三維陣列的想法去想就好,沒碰過的建議不要直接使用字串二維陣列(其實不難,但就是空間上的概念要有)
還有布林陣列也可以開三維喔

解題想法

經典BFS迷宮題目(上下左右)加上三維(x、y、z)中的z方向操控上層跟下層
我初始是想說直接用字元三維陣列,但我怕多組測試資料會直接讀取到TLE
所以我就用字串二維陣列來進行,我是第一次用二維字串陣列來進行空間中的模擬
以往就只是用來儲存提取爾已(所以真的不難)
主要方向如第一行,接下來我就說說最該注意的地方,找點的各種操作、判斷,你在操控的是字串二維陣列
但實際上是用它當作一個三維字元陣列,所以z方向也需要注意(需要多想想,不難喔)

AC code

#include<bits/stdc++.h>
using namespace std;
int l,r,c;
string s[35][35];
bool ta[35][35][35];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
struct job{
    int nowx,nowy,nowz;
    int data;
};
deque<job>dq;
int ans=0;
job ga,pa;
int sx,sy,sz;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    while(cin >> l >> r >> c){
        if(l==0 && r==0 && c==0){
            break;
        }
        bool ta1=false;
        dq.clear();
        for(int x=0;x<l;x++){
            for(int y=0;y<r;y++){
                cin >> s[x][y];
                for(int z=0;z<c;z++){
                    if(s[x][y][z]=='S'){
                        sx=y;
                        sy=z;
                        sz=x;
                    }
                }
            }
        }
        memset(ta,0,sizeof(ta));
        ga.nowx=sx;
        ga.nowy=sy;
        ga.nowz=sz;
        ga.data=0;
        dq.push_back(ga);
        while(!dq.empty() && !ta1){
            ga=dq.front();
            dq.pop_front();
            pa.data=ga.data+1;
            for(int x=0;x<4;x++){
                pa.nowx=ga.nowx+dx[x];
                pa.nowy=ga.nowy+dy[x];
                pa.nowz=ga.nowz;
                if(!ta[pa.nowz][pa.nowx][pa.nowy] && (pa.nowx>=0 && pa.nowx<r) && (pa.nowy>=0 && pa.nowy<c)){
                    if(s[pa.nowz][pa.nowx][pa.nowy]=='.'){
                        dq.push_back(pa);
                        ta[pa.nowz][pa.nowx][pa.nowy]=true;
                    }
                    else if(s[pa.nowz][pa.nowx][pa.nowy]=='E'){
                        ans=pa.data;
                        ta1=true;
                        break;
                    }
                }
            }
            if(!ta1){
                pa.nowx=ga.nowx;
                pa.nowy=ga.nowy;
                pa.nowz=ga.nowz-1;
                if(!ta[pa.nowz][pa.nowx][pa.nowy] && (pa.nowz>=0 && pa.nowz<l)){
                    if(s[pa.nowz][pa.nowx][pa.nowy]=='.'){
                        dq.push_back(pa);
                        ta[pa.nowz][pa.nowx][pa.nowy]=true;
                    }
                    else if(s[pa.nowz][pa.nowx][pa.nowy]=='E'){
                        ans=pa.data;
                        ta1=true;
                        break;
                    }
                }
                pa.nowz=ga.nowz+1;
                if(!ta[pa.nowz][pa.nowx][pa.nowy] && (pa.nowz>=0 && pa.nowz<l)){
                    if(s[pa.nowz][pa.nowx][pa.nowy]=='.'){
                        dq.push_back(pa);
                        ta[pa.nowz][pa.nowx][pa.nowy]=true;
                    }
                    else if(s[pa.nowz][pa.nowx][pa.nowy]=='E'){
                        ans=pa.data;
                        ta1=true;
                        break;
                    }
                }
            }
        }
        if(ta1)
        cout << "Escaped in " << ans << " minute(s)." << endl;
        else{
            cout << "Trapped!" << endl;
        }
    }
    return 0;
}

題目連結 : UVa00532 - Dungeon Master