连接地址http://acm.hdu.edu.cn/showproblem.php?pid=1253,就是一个广搜就过了,当然,时间效率不是很高了……
Accepted | 1253 | 874MS | 1544K | 1846 B | C++ |
#include<iostream> #include<queue> using namespace std; int adj[52][52][52]; bool visited[52][52][52]; bool isOut; 标记是否已经找到出口 int add[6][3] = {{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};下,上,右,左,外,里 int A,B,C,T; 城堡的大小及逃脱时间限制 int time[52][52][52]; 逃脱时间time[i][i][i]=time[j][j][j]+1 struct node { int x,y,z; }now,next; bool check(int x,int y,int z)///检测是否已经越界,不越界返回true { if(x>=0 && x<A && y>=0 && y<B && z>=0 && z<C) return true; else return false; } void bfs() { now.x = 0; now.y = 0; now.z = 0; queue<node> q; q.push(now); visited[now.x][now.y][now.z] = true; time[now.x][now.y][now.z] = 0; while(!q.empty()) { now = q.front(); q.pop(); for(int i=0;i<6;i++) { if(!visited[now.x+add[i][0]][now.y+add[i][1]][now.z+add[i][2]] && !adj[now.x+add[i][0]][now.y+add[i][1]][now.z+add[i][2]] && check(now.x+add[i][0],now.y+add[i][1],now.z+add[i][2])) { next.x=now.x+add[i][0]; next.y=now.y+add[i][1]; next.z=now.z+add[i][2]; time[next.x][next.y][next.z] = time[now.x][now.y][now.z]+1; if((next.x==A-1) && (next.y==B-1) && (next.z==C-1) && (time[next.x][next.y][next.z]<=T)) { isOut = true; return; } visited[next.x][next.y][next.z] = true; q.push(next); } } } } int main() { int K; scanf("%d",&K); while(K--) { memset(visited,false,sizeof(visited)); memset(adj,0,sizeof(adj)); memset(time,0,sizeof(time)); isOut = false; /初始化 scanf("%d%d%d%d",&A,&B,&C,&T); int i,j,k; for(i=0;i<A;i++) for(j=0;j<B;j++) for(k=0;k<C;k++) { scanf("%d",&adj[i][j][k]); } bfs(); if(isOut) printf("%d\n",time[A-1][B-1][C-1]); else printf("%d\n",-1); } return 0; }