今天AC了杭电OJ的1253题《胜利大逃亡》,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253
该题目是一个比较经典立方体迷宫问题,要求在给定的时间内从始点(0,0,0)逃到出口(a-1,b-1,c-1),这里我采用的是BFS(宽度优先搜索)。
代码如下:
#include<iostream>
using namespace std; int map[55][55][55],a,b,c,times,visit[55][55][55]; int fx[6]={1,-1,0,0,0,0},fy[6]={0,0,1,-1,0,0},fz[6]={0,0,0,0,1,-1}; typedef struct { int x; int y; int z; int t; }Node; Node node[125005]; int check(int p,int q,int x) { int flag=1; if(p<0||p>=a||q<0||q>=b||x<0||x>=c) flag=0; else if(visit[p][q][x]==1) flag=0; else if( map[p][q][x]==1) flag=0; return flag; } void bfs(int m,int n,int h) { int i,head,tail,p,q,x; head=0; tail=1; node[1].x=m; node[1].y=n; node[1].z=h; node[1].t=0; if(m==a-1&&n==b-1&&h==c-1) { cout<<"0"<<endl; return ; } while( head!=tail) { head++; for(i=0;i<6;i++) { p=node[head].x+fx[i]; q=node[head].y+fy[i]; x=node[head].z+fz[i]; if(check(p,q,x)==1) { tail++; node[tail].x=p; node[tail].y=q; node[ tail].z=x; node[tail].t=node[head].t+1; visit[node[ tail].x][node[tail].y][node[tail].z]=1; if(node[tail].x==a-1&&node[tail].y==b-1&&node[tail].z==c-1 ) { if(node[tail].t>times) { cout<<"-1"<<endl; } else cout<<node[ tail].t<<endl; return ; } } } } cout<<"-1"<<endl; } int main( ) { int i,j,k,t; scanf( "%d",&t); while(t--) { scanf("%d%d%d%d",&a,&b,&c,×); memset(visit,0,sizeof(visit)); for(i=0;i<a;i++) for(j=0;j<b;j++) for( k=0;k<c;k++) scanf("%d",&map[i][j][k]); bfs(0,0,0); } return 0; }
hdoj上要C++才能AC,大概900MS左右,G++的话会超时的。