迷宫问题
来源:互联网 发布:环球天下期货软件 编辑:程序博客网 时间:2024/05/24 02:37
问题描述
定义一个二维数组:
int maze[5][5] = {0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
问题分析
在这个问题中,从开始位置按照4个方向进行搜索,当这个点没被访问过,或者这个点能够走通,此时将这个点加入到栈当中,每次加入栈中的只是该节点的下一个节点,直到找到目标节点为止,当走到死胡同时候即4个方向都不能走通此时将这个点从栈中删除,弹出下一个顶点。当找到目标节点时,此时栈中的元素,即为从开始节点到目标节点的路径。问题优化
在随意给定目标节点以及开始节点时,此时可以根据两个节点的位置,设置有限搜索的方向,例如上一个例子,假设开始节点为(0,0),目标节点(4,4),此时可以有限朝右,下方向搜索。- 代码
#include<iostream>#include<stack>#include<cstring>#define Max_row 100#define Max_col 100using namespace std;int matrix[Max_row][Max_col];void maze(int begin_row,int begin_col,int target_row,int target_col,int row,int col){ stack<int> Stack,out_stack; int visit[Max_row][Max_col],h,r,c,Max_length; memset(visit,0,sizeof(visit)); Max_length=row*col; Stack.push(begin_row*10+begin_col); visit[begin_row][begin_col]=1; while(!Stack.empty()) { h=Stack.top(); r=h/10; c=h%10; if(r==target_row&&c==target_col) //找到目标节点时,输出路径 { if(!out_stack.empty()) { out_stack.pop(); } stack<int> S(Stack); if(Stack.size()<Max_length) { Max_length=Stack.size(); while(!S.empty()) { out_stack.push(S.top()); S.pop(); } } Stack.pop(); continue; } if(matrix[r+1][c]!=1&&r+1<row&&visit[r+1][c]==0) //向下搜 { Stack.push((r+1)*10+c); visit[r+1][c]=1; } else if(matrix[r-1][c]!=1&&r-1>=0&&visit[r-1][c]==0)//向上搜 { Stack.push((r-1)*10+c); visit[r-1][c]=1; } else if(matrix[r][c+1]!=1&&c+1<col&&visit[r][c+1]==0)//向右搜 { Stack.push(r*10+c+1); visit[r][c+1]=1; } else if(matrix[r][c-1]!=1&&c-1>=0&&visit[r][c-1]==0)向左搜 { Stack.push(r*10+c-1); visit[r][c-1]=1; } else //遇到死角的时候,回溯到上一个节点 { Stack.pop(); } } while(!out_stack.empty()) { h=out_stack.top(); cout<<"("<<h/10<<","<<h%10<<")"<<endl; out_stack.pop(); }}int main(){ int col,row,begin_row,begin_col,target_row,target_col; cout<<"输入矩阵的行和列:\n"; cin>>row>>col; for(int i=0;i<row;i++) for(int j=0;j<col;j++) cin>>matrix[i][j]; cout<<"输入开始坐标:\n"; cin>>begin_row>>begin_col; cout<<"输入目标坐标:\n"; cin>>target_row>>target_col; maze(begin_row,begin_col,target_row,target_col,row,col); return 0;}
0 0
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题...
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 基于Hexo+GitHub Pages 搭建博客详细教程
- 经典排序算法:
- Jayant Sinha:破产法案清零;将有助于提高商业便利
- 今天简单的学习了一下布尔运算。
- Jersey实现Restful webservice及Ajax访问
- 迷宫问题
- 1041,考试座位号,PAT
- Ucore_lab6
- http2
- elasticsearch1.7.2安装ik分词器
- 数组一直报下标溢出,通过null判断都没用
- Android LED控制
- 如何通过Maven的Jetty插件运行Web工程
- 线程池的使用(二)