用BFS解决迷宫问题
2014-10-03 06:28
393 查看
在一个n*n的矩阵里走,从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走,求最短步数。n*n是01矩阵,0代表该格子没有障碍,为1表示有障碍物。
int mazeArr[maxn][maxn]; //表示的是01矩阵
int stepArr[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //表示上下左右4个方向
int visit[maxn][maxn]; //表示该点是否被访问过,防止回溯,回溯很耗时。
解题思路:
BFS找出来的是最短路径,如果用DFS,那么寻找出来的不是最短路径。
我们先对原点的上下左右进行访问,如果上下左右的点非障碍物,并且还没访问过,那么就将这些点入队列,并设置为已经访问,然后再依次把这些点出队列,并且重复之前的步骤对这些点的进行上下左右访问。。。。如果最后访问到终点(n-1,n-1),则结束
代码如下:
int mazeArr[maxn][maxn]; //表示的是01矩阵
int stepArr[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //表示上下左右4个方向
int visit[maxn][maxn]; //表示该点是否被访问过,防止回溯,回溯很耗时。
解题思路:
BFS找出来的是最短路径,如果用DFS,那么寻找出来的不是最短路径。
我们先对原点的上下左右进行访问,如果上下左右的点非障碍物,并且还没访问过,那么就将这些点入队列,并设置为已经访问,然后再依次把这些点出队列,并且重复之前的步骤对这些点的进行上下左右访问。。。。如果最后访问到终点(n-1,n-1),则结束
代码如下:
#include<iostream> using namespace std; //定义迷宫的行列 #define ROW_COL 4 //定义一个结构体,表示经过的点路径 struct Node { int x; int y; int step; }; //赋值 Node fuzhi(int x,int y,int step) { Node p; p.x=x; p.y=y; p.step=step; return p; } //实现一个循环队列 //===================================== #define QueueSize 30 typedef struct { Node Seq[QueueSize]; int front; int rear; int count; }RQueue; RQueue Q; void Initiate_Queue(RQueue *Q) { Q->front=0; Q->rear=0; Q->count=0; } void AppendQueue(RQueue *Q,Node data) { if(Q->count>=QueueSize) { cout<<"overflow"<<endl; return ; } Q->Seq[Q->rear]=data; Q->rear=(Q->rear+1)%QueueSize; Q->count++; } int QueueNotEmpty(RQueue *Q) { if(Q->count!=0) return 1; else return 0; } Node DeleteQueue(RQueue *Q) { if(Q->count<=0) { cout<<"empty"<<endl; exit(0); } Node d; d=Q->Seq[Q->front]; Q->front=(Q->front+1)%QueueSize; Q->count--; return d; } //======================= //迷宫图的矩阵 int mazeArr[4][4]= { {0,0,1,1}, {0,1,1,0}, {0,0,1,0}, {0,1,0,0} }; int visit[ROW_COL][ROW_COL]; //表示上下左右 int stepArr[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //对其进行BFS,找出的路径为最短路径,注意二位数组的形参是int (*mazeArr)[4] int BFS(int (*mazeArr)[4],Node node,int n) { for(int i=0;i<ROW_COL;i++) for(int j=0;j<ROW_COL;j++) visit[i][j]=0; Node N; Initiate_Queue(&Q); AppendQueue(&Q,node); while(QueueNotEmpty(&Q)) { N=DeleteQueue(&Q); if(N.x==n-1 &&N.y==n-1) { return N.step; } visit[N.x][N.y]=1; //对该点的上下左右进行遍历,如果符合条件,就入队列 for(int i=0;i<4;i++) { int x=N.x+stepArr[i][0]; int y=N.y+stepArr[i][1]; if(x>=0 &&y>=0&&x<n&&y<n&&!visit[x][y]&& mazeArr[x][y]==0) { visit[x][y]=1; N=fuzhi(x,y,N.step+1); AppendQueue(&Q,N); } } } return -1; } void main() { Node node; node=fuzhi(0,0,0); cout<<BFS(mazeArr,node,ROW_COL); getchar(); }
相关文章推荐
- BFS 、DFS 解决迷宫入门问题
- POJ 2049-Finding Nemo(三维bfs解决类迷宫问题)
- BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
- BFS和DFS方法解决走迷宫问题
- BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
- 迷宫问题bfs解决
- 迷宫问题 bfs
- 利用堆栈解决迷宫问题
- POJ 2251 (三维迷宫问题) DFS /BFS
- 迷宫问题的解决-栈的应用
- 解决迷宫问题, 栈和队列
- 迷宫问题BFS暴搜
- POJ 3984 迷宫问题 (BFS,水题)
- 迷宫问题 BFS回溯保存路径
- (dfs+bfs+记录)迷宫问题(P3984)
- bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.
- POJ 3984 迷宫问题 解决报告
- 经典迷宫问题—BFS
- 用纯C语言解决迷宫问题,简洁易懂
- VC++2012编程演练数据结构《8》回溯法解决迷宫问题