迷宫探路问题

目的:找出一条可达的路,有两种方法实现。

第一种:非递归方法

此方法需用到栈结构,可使用STL,将当前周围有其他未到达过的顶点的顶点压入栈中,保持栈顶一直是当前顶点。

当栈顶顶点周围无可达顶点时,就将该顶点弹出,一直循环到找到目的地或栈空,若到达,则将栈中点全部打印出就是一条路,若栈空,则无路可到达目的地。

1000001000
0100101000
0101101000
1000001100
0110101000
1010010000
0101000000
0100111000
0010001100
0001100111

地图如图,‘1’表示可达,‘0’表示不可达,但需要先将图周围添加一层不可达的点,目的是避免检查下标越界,若不想改变地图,还需另加一个标志矩阵flagmap

 1 int stackrealize(const int row,const int col)
 2 {
 3     while(!ps.empty()){
 4         point cur = ps.top();
 5         int flag = 0;
 6         for(int i=0;i<8;i++){
 7             point p = cur+dir[i];
 8             if(!flagmap[p.x][p.y] && map[p.x][p.y]=='1'){
 9                 flag = 1;
10                 cur=p;
11                 flagmap[p.x][p.y] = 1;
12                 ps.push(cur);
13                 if(cur.x==row && cur.y==col){
14                     cout<<ps<<endl;
15                     return 1;
16                 }
17                 break;
18             }
19         }
20         if(!flag)ps.pop();
21     }
22     return 0;
23 }

这里point是一个结构体类型:

1 struct point{
2     int x,y;
3     point(){};
4     point(int xx,int yy){x=xx;y=yy;};
5     point operator + (point p){
6         return point(x+p.x,y+p.y);
7     }
8 }way[MAXN*MAXN];

分析:最后保留在栈里面的都是可达目标点的。

第二种:递归方法。

比较简单,直接粘代码:

 1 int BFS(point &cur,const int row,const int col)
 2 {
 3     if(cur.x==row && cur.y==col){
 4         way[len] = cur;
 5         return 1;
 6     }
 7     int flag = 0;
 8     for(int i=0;i<8;i++){
 9         point tem = cur + dir[i];
10         if(flagmap[tem.x][tem.y]==0 && map[tem.x][tem.y]=='1'){
11             flag = 1;
12             flagmap[tem.x][tem.y] = 1;
13          )  if(BFS(tem,row,col))way[len++] = tem;
14             break;
15         }
16     }
17     return flag;
18 }

需要注意的是,要想打印路径,递归函数就要带返回标志,意思是,如果该点最终在要打印的路上,就返回1,否则返回0(可以看着地图模拟一下)。

 

posted on 2015-11-01 00:16  WindInWillows  阅读(298)  评论(0编辑  收藏  举报

导航