标签:
目的:找出一条可达的路,有两种方法实现。
第一种:非递归方法。
此方法需用到栈结构,可使用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(可以看着地图模拟一下)。
标签:
原文地址:http://www.cnblogs.com/WindInWillows/p/4923184.html