首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信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