POJ 2251 (三维迷宫问题) DFS /BFS

这道题开始时用DFS做的,超时了,这也是意料之中的。后来改用BFS做AC。

这道题时最基本的典型的搜索问题,通过DFS能够找到一个路径,但是不能保证是最优的,需要回溯搜索才能找到最优。通过BFS就能够找到一个最优解(如果存在),符合标准的BFS搜索。这里记录下来就为了作为搜索题的基础,以后能有所进步。

#include <iostream> #include <queue> #include <cstring> using namespace std; int l,r,c; char g[31][31][31]; int shift[6][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}}; short flag[31][31][31]; int s[3]; int e[3]; int min_path=0xffff; struct Point { int x; int y; int z; int step; }; queue<Point> mq; bool inrange(int x,int y,int z) { if(x>=0 && x<l && y>=0 && y<r && z>=0 && z<c) return true; else return false; } void dfs(int x,int y,int z) { int i ,j,k; //如果当前“位置”已经在当前路径上(flag[x][y][z]==1)或者当前“位置不可达”,或者当前位置越界,回溯 if( !inrange(x,y,z) || g[x][y][z]=='#' || flag[x][y][z]==1) return; else if(x==e[0] && y == e[1] && z==e[2]) { if(min_path>step) min_path=step; return; } for(i=0;i<6;i++) { int x1=x+shift[i][0]; int y1=y+shift[i][1]; int z1=z+shift[i][2]; flag[x][y][z]=1; step++; dfs(x1,y1,z1); flag[x][y][z]=0; step--; } } void bfs(int x,int y,int z) { Point p; p.x=x; p.y=y; p.z=z; p.step=0; flag[x][y][z]=1; mq.push(p); while(!mq.empty()) { Point q = mq.front(); mq.pop(); if(q.x==e[0] && q.y==e[1] && q.z==e[2]) { min_path = q.step; return; } for(int i=0;i<6;i++) { Point m; m.x= q.x+shift[i][0]; m.y= q.y+shift[i][1]; m.z= q.z+shift[i][2]; m.step =q.step+1; if(inrange(m.x,m.y,m.z) && g[m.x][m.y][m.z]!='#' && flag[m.x][m.y][m.z]==0) { flag[m.x][m.y][m.z]=1; mq.push(m); } } } } int main() { cin>>l; cin>>r; cin>>c; int i,j,k; while(l || r || c) { min_path=0xffff; memset(g,0,sizeof(g)); memset(flag,0,sizeof(flag)); while(!mq.empty()) { mq.pop(); } for(i=0;i<l;i++) { for(j=0;j<r;j++) { getchar(); for(k=0;k<c;k++) { g[i][j][k]=getchar(); if(g[i][j][k]=='S') { s[0]=i; s[1]=j; s[2]=k; } if(g[i][j][k]=='E') { e[0]=i; e[1]=j; e[2]=k; } } } getchar(); } bfs(s[0],s[1],s[2]); if(min_path<0xffff) cout<<"Escaped in "<<min_path<<" minute(s)."<<endl; else cout<<"Trapped!"<<endl; cin>>l; cin>>r; cin>>c; } }

你可能感兴趣的:(c,IE,Path)