今天做的题,写完wa,找错真的找了好久,看题解,也发现方法其实差不许多,用各种方法试,找出了几处错误,最后ac,原来做的搜索都是二维的,今天的立体搜索让人印象深刻。
立体搜索也是是否能从走出地下城(迷宫),三维的搜索也是很经典。
Dungeon Master
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
#if 0
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int l,c,r,step[50][50][50],ei,ej,ek,si,sj,sk;
char a[50][50][50];
bool flag[50][50][50],flag1;
int f[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int ok(int k,int i, int j)
{
if(k>=0&&k<l&&i>=0&&i<r&&k>=0&& k<c)
return 1;
else
return 0;
}
void bfs(int z,int x,int y)
{
queue<int> q;
q.push(z);
q.push(x);
q.push(y);
while(!q.empty())
{
int ai,aj,ak;
ak=q.front();
q.pop();
ai=q.front();
q.pop();
aj=q.front();
q.pop();
if(ak==ek && ai==ei && aj==ej)
{
cout<<step[ak][ai][aj]<<endl;
flag1=1;
return;
}
for(int i=0; i<6; i++)
{
int ki=ak+f[i][0];
int ii=ai+f[i][1];
int ji=aj+f[i][2];
if(ki==ek && ii==ei && ji==ej)
{
cout<<"Escaped in "<<step[ak][ai][aj]+1<<" minute(s)."<<endl;
flag1=1;
return;
}
if(a[ki][ii][ji]=='.' && ok(ki,ii,ji) && flag[ki][ii][ji]==0)
{
flag[ki][ii][ji]=1;
q.push(ki);
q.push(ii);
q.push(ji);
step[ki][ii][ji]=step[ak][ai][aj]+1;
}
}
}
}
int main()
{
while(cin>>l>>r>>c && l+r+c)
{
memset(step,0,sizeof(step));
memset(a,0,sizeof(a));
memset(flag,0,sizeof(flag));
flag1=0,ek=0,ei=0,ej=0,si=sj=sk=0;
for(int k=0; k<l; k++)
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
{
cin>>a[k][i][j];
if(a[k][i][j]=='S')
{
sk=k;
si=i;
sj=j;
}
if(a[k][i][j]=='E')
{
ek=k;
ei=i;
ej=j;
}
}
flag[sk][si][sj]=1;
bfs(sk,si,sj);
if(flag1==0)
cout<<"Trapped!"<<endl;
}
}
#endif