http://poj.org/problem?id=2251
bfs三维的,见代码注释。
#include<iostream> #include<cstring> #include<queue> using namespace std; bool hash[35][35][35]; char map[35][35][35]; struct prog { int x,y,z,step; }start; int main(void) { int l,r,c,i,j,k; while(cin>>l>>r>>c,l&&r&&c) { memset(hash,false,sizeof(hash)); for(i=0;i<l;i++) for(j=0;j<r;j++) { cin>>map[i][j]; for(k=0;k<c;k++) if(map[i][j][k]=='S') { start.x=i; start.y=j; start.z=k; start.step=0; hash[i][j][k]=true; } } queue<prog>bfs; bfs.push(start); bool found=false; while(!bfs.empty()) { prog tmp=bfs.front(); bfs.pop(); if(map[tmp.x][tmp.y][tmp.z]=='E') { found=true; cout<<"Escaped in "<<tmp.step<<" minute(s)."<<endl; break; } tmp.step++; prog tmp2; if(tmp.x>0) {//向下走,所以改点不能在第一层,则x要大于0 tmp2=tmp; tmp2.x--; if(map[tmp2.x][tmp2.y][tmp2.z]!='#'&&hash[tmp2.x][tmp2.y][tmp2.z]==false) {//如果下一层不是障碍物并且也没走过,则往下走,并标记该点已走过,入队 hash[tmp2.x][tmp2.y][tmp2.z]=true; bfs.push(tmp2); } } if(tmp.x<l-1) {//向上 tmp2=tmp; tmp2.x++; if(map[tmp2.x][tmp2.y][tmp2.z]!='#'&&hash[tmp2.x][tmp2.y][tmp2.z]==false) { hash[tmp2.x][tmp2.y][tmp2.z]=true; bfs.push(tmp2); } } if(tmp.y>0) {//向北 tmp2=tmp; tmp2.y--; if(map[tmp2.x][tmp2.y][tmp2.z]!='#'&&hash[tmp2.x][tmp2.y][tmp2.z]==false) { hash[tmp2.x][tmp2.y][tmp2.z]=true; bfs.push(tmp2); } } if(tmp.y<r-1) {//向南 tmp2=tmp; tmp2.y++; if(map[tmp2.x][tmp2.y][tmp2.z]!='#'&&hash[tmp2.x][tmp2.y][tmp2.z]==false) { hash[tmp2.x][tmp2.y][tmp2.z]=true; bfs.push(tmp2); } } if(tmp.z>0) {//向西 tmp2=tmp; tmp2.z--; if(map[tmp2.x][tmp2.y][tmp2.z]!='#'&&hash[tmp2.x][tmp2.y][tmp2.z]==false) { hash[tmp2.x][tmp2.y][tmp2.z]=true; bfs.push(tmp2); } } if(tmp.z<c-1) {//向东 tmp2=tmp; tmp2.z++; if(map[tmp2.x][tmp2.y][tmp2.z]!='#'&&hash[tmp2.x][tmp2.y][tmp2.z]==false) { hash[tmp2.x][tmp2.y][tmp2.z]=true; bfs.push(tmp2); } } } if(!found) cout<<"Trapped!"<<endl; } return 0; }