您的位置:首页 > 其它

UVA532 POJ2251 ZOJ1940 Dungeon Master

2018-03-20 23:04 387 查看
做了这个题我把dfs跟bfs又温习了一遍,明白了什么时候该用dfs什么时候改用bfs,详情请戳这里,下面附上dfs跟bfs代码,但dfs代码是个TLE的

TLE代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;

char a[31][31][31];
int book[31][31][31];

int next[][3]={0,1,0,
0,0,1,
0,-1,0,
0,0,-1,
1,0,0,
-1,0,0};

int l,r,c;
int mini;

void dfs(int lev,int row,int col,int temp)
{
if(a[lev][row][col]=='E')
{
if(mini>temp)
mini=temp;
return;
}
int tlev,trow,tcol;
for(int i=0;i<6;i++)
{
tlev=lev+next[i][0];
trow=row+next[i][1];
tcol=col+next[i][2];
if(tlev>=l||tlev<0||trow>=r||trow<0||tcol>=c||tcol<0)
continue;
if(a[tlev][trow][tcol]!='#'&&book[tlev][trow][tcol]==0)
{
book[tlev][trow][tcol]=1;
dfs(tlev,trow,tcol,temp+1);
book[tlev][trow][tcol]=0;
}
}
return;
}

int main()
{
ios::sync_with_stdio(false);cin.tie(0);

w
e0fa
hile(cin>>l>>r>>c&&(l||r||c))
{
int ti,tj,tk;
for(int i=0;i<l;i++)
for(int j=0;j<r;j++)
cin>>a[i][j];
int flag=0;
for(int i=0;i<l&&!flag;i++)
for(int j=0;j<r&&!flag;j++)
for(int k=0;k<c&&!flag;k++)
{
if(a[i][j][k]=='S')
{
ti=i;
tj=j;
tk=k;
}
flag=1;
break;
}
//        cout<<ti<<tj<<tk<<endl;
mini=99999;
dfs(ti,tj,tk,0);
if(mini==99999)
cout<<"Trapped!"<<endl;
else
printf("Escaped in %d minute(s).\n",mini);
}
return 0;
}


ac代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;

char a[31][31][31];
int book[31][31][31];

int next[][3]={0,1,0,
0,0,1,
0,-1,0,
0,0,-1,
1,0,0,
-1,0,0};

struct dun
{
int x;
int y;
int step;
int z;
}start,ter;

int l,r,c;
int mini;

void bfs()
{
queue<dun> q;
dun node;
q.push(start);
while(!q.empty())
{
node=q.front();
q.pop();
if(node.x==ter.x&&node.y==ter.y&&node.z==ter.z)
{
mini=node.step;
break;
}
for(int i=0;i<6;i++)
{
int tx,ty,tz;
tx=node.x+next[i][0];
ty=node.y+next[i][1];
tz=node.z+next[i][2];
if(tx<0||ty<0||tz<0||tx>=l||ty>=r||tz>=c)
continue;
if(a[tx][ty][tz]!='#')
{
a[tx][ty][tz]='#';
dun v;
v.x=tx;
v.y=ty;
v.z=tz;
v.step=node.step+1;
q.push(v);
}
}
}

}

int main()
{
ios::sync_with_stdio(false);cin.tie(0);

while(scanf("%d%d%d",&l,&r,&c)!=EOF&&(l||r||c))
{
int ti,tj,tk;
for(int i=0;i<l;i++)
for(int j=0;j<r;j++)
scanf("%s",a[i][j]);
int flag=0;

for(int i=0;i<l&&!flag;i++)
for(int j=0;j<r&&!flag;j++)
for(int k=0;k<c&&!flag;k++)
{
if(a[i][j][k]=='S')
{
start.x=i;
start.y=j;
start.z=k;
start.step=0;
}
if(a[i][j][k]=='E')
{
ter.x=i;
ter.y=j;
ter.z=k;
}
}
mini=99999;
bfs();
if(mini==99999)
printf("Trapped!\n");
else
printf("Escaped in %d minute(s).\n",mini);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: