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

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

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

#include #include #include 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 mq; bool inrange(int x,int y,int z) { if(x>=0 && x=0 && y=0 && zstep) 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; cin>>r; cin>>c; } }

你可能感兴趣的:(初识算法)