解决迷宫问题, 栈和队列
2012-05-07 12:53
453 查看
#include<iostream> using namespace std; const int M = 10, N = 10; int mg[M+1][N+1]={ /*M=10,N=10*/ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}}; const MaxSize = 200; struct { int i,j; /*方块的位置*/ int pre; /*本路径中上一方块在Qu中的下标*/ } Qu[MaxSize]; int front=-1,rear=-1; /*队首指针和队尾指针*/ //(1)首先将(1,1)入队; //(2)在队列Qu不为空时循环:出队一次(由于不是环形队列,该出队元素仍在队列中),称该出队的方块为当前方块,front为该方块在Qu中的下标。 // ①如果当前方块是出口,则输出路径并结束。 // ②否则,按顺时针方向找出当前方块的四个方位中可走的相邻方块(对应的mg数组值为0),将这些可走的相邻方块均插入到队列Qu中,其pre设置为本搜索路径中上一方块在Qu中的下标值,也就是当前方块的front值,并将相邻方块对应的mg数组值置为-1,以避免回过来重复搜索。 //(3)若队列为空仍未找到出口,即不存在路径。 void mgpath() { cout << "start..."; ++rear; Qu[rear].i = 1; Qu[rear].j = 1; Qu[rear].pre = -1; int i, j; bool find = false; while (front <= rear && !find) { ++front; if (Qu[front].i == M-2 && Qu[front].j == N-2) { find = true; cout << front; int tmp = front; while (tmp != -1) { cout << " "; cout << Qu[tmp].i << "," << Qu[tmp].j; tmp = Qu[tmp].pre; } return; } int dir = 0; while (dir < 4) { switch (dir) { case 0: i = Qu[front].i-1; j = Qu[front].j; break; case 1: i = Qu[front].i; j = Qu[front].j+1; break; case 2: i = Qu[front].i+1; j = Qu[front].j; break; case 3: i = Qu[front].i; j = Qu[front].j-1; break; } if (mg[i][j] == 0) { ++rear; Qu[rear].i = i; Qu[rear].j = j; Qu[rear].pre = front; mg[i][j] = -1; } ++dir; } } cout << "err"; } int main() { mgpath(); return 0; }
const MaxSize = 100; struct { int i; /*当前方块的行号*/ int j; /*当前方块的列号*/ int di; /*di是下一可走相邻方位的方位号*/ } Stack[MaxSize]; /*定义栈*/ int top=-1; /*初始化栈指针*/ void mgpath() /*路径为:(1,1)->(M-2,N-2)*/ { int i,j,di,find,k; top++; /*初始方块进栈*/ Stack[top].i=1;Stack[top].j=1;Stack[top].di=-1;mg[1][1]=-1; while (top>-1) /*栈不空时循环*/ { i=Stack[top].i;j=Stack[top].j;di=Stack[top].di; if (i==M-2 && j==N-2) /*找到了出口,输出路径*/ { printf("迷宫路径如下:\n"); for (k=0;k<=top;k++) { printf("\t(%d,%d)",Stack[k].i,Stack[k].j); if ((k+1)%5==0) printf("\n"); } } printf("\n"); return; find=0; while (di<4 && find==0) /*找下一个可走方块*/ { di++; switch(di) { case 0:i=Stack[top].i-1;j=Stack[top].j;break; case 1:i=Stack[top].i;j=Stack[top].j+1;break; case 2:i=Stack[top].i+1;j=Stack[top].j;break; case 3:i=Stack[top].i,j=Stack[top].j-1;break; } if (mg[i][j]==0) find=1; } if (find==1) /*找到了下一个可走方块*/ { Stack[top].di=di; /*修改原栈顶元素的di值*/ top++; /*下一个可走方块进栈*/ Stack[top].i=i;Stack[top].j=j;Stack[top].di=-1; mg[i][j]=-1; /*避免重复走到该方块*/ } else /*没有路径可走,则退栈*/ { mg[Stack[top].i][Stack[top].j]=0; /*让该位置变为其他路径可走方块*/ top--; } } printf("没有可走路径!\n"); }
相关文章推荐
- 数据结构-顺序队列解决最短迷宫路径问题
- 利用队列解决迷宫问题
- C语言使用广度优先搜索算法解决迷宫问题(队列)
- scala 回溯法解决迷宫问题
- 优先队列实现 大小根堆 解决top k 问题
- 关于java用阻塞队列解决生产者消费者问题总结
- C语言链栈以及回溯算法解决迷宫问题
- (java)简单回朔法解决迷宫问题
- LabVIEW之安装队列工具包AMC安装问题解决
- 用BFS解决迷宫问题
- 遗传算法解决迷宫寻路问题(Java实现)
- BFS 、DFS 解决迷宫入门问题
- 用栈解决迷宫问题
- 像素转换问题-队列解决办法(或者dfs)
- RabbitMQ(消息队列)Linux安装相关问题解决
- 最小优先队列 解决TopK问题
- PHP结合memcacheq消息队列解决并发问题
- poj3984(迷宫问题)(bfs和队列)
- 消息队列监听器无法注入bean的问题解决
- 迷宫最短路径问题(ShortestPath)的求解——利用链式队列