回溯求解-迷宫问题
来源:互联网 发布:施工进度网络计划绘制 编辑:程序博客网 时间:2024/06/05 02:45
K -
迷宫问题
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
左上角到右下角的最短路径,格式如样例所示。
0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0
(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)
#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;int map[10][10];struct node {int x[100];// x和y分别用来保存行列坐标 int y[100];int d;// 用来保存路径的长度,便于找到最短路径 };node a[50];//用来保存所有的可能的路径 int p=0,q;void lujing()//用来记录路径 {int map2[10][10],i,j;//map2 用来copy地图,因为原来地图不能动,动了原来的地图会导致回溯失败; for(i=0;i<10;i++){for(j=0;j<10;j++){map2[i][j]=map[i][j];}}i=1,j=1;a[p].d=0,q=0;while(1)//路径上的点全部被标记为 2 ,然后就从起点开始去记录路径 {a[p].d++;a[p].x[q]=i,a[p].y[q++]=j;if(i==5&&j==5) break;//终点被记录下来就应该退出手动退出死循环 if(map2[i][j+1]==2) j++;else if(map2[i][j-1]==2) j--;else if(map2[i+1][j]==2) i++;else if(map2[i-1][j]==2) i--;map2[i][j]=0;// 记录过得点就还原(也可以标记为其他的),否则判断下一个点可能还会判断到自己 }p++;}void visit(int i,int j){map[i][j]=2;if(i==5&&j==5)//查找到终点,就应该记录下这条路径 {lujing();}if(map[i][j+1]==0) visit(i,j+1);//每到达一个点,按照四个方向查找 if(map[i+1][j]==0) visit(i+1,j);if(map[i][j-1]==0) visit(i,j-1);if(map[i-1][j]==0) visit(i-1,j);map[i][j]=0; //查找完一个点就应该退回上一个点,回溯在此! }void init()//将迷宫的周围设置成障碍,减少判断是否超出迷宫的范围 {for(int i=0;i<7;i++){map[i][0]=1;map[0][i]=1;map[i][6]=1;map[6][i]=1;}}int cmp(node x,node y){return x.d<y.d;}int main(){init();for(int i=1;i<6;i++){for(int j=1;j<6;j++){cin>>map[i][j];}}visit(1,1);sort(a,a+p,cmp);//按照路径的长短排序 for(int i=0;i<a[0].d;i++){cout<<"("<<a[0].x[i]-1<<", "<<a[0].y[i]-1<<")"<<endl;}return 0; }
阅读全文
0 0
- 回溯求解-迷宫问题
- 回溯法求解迷宫问题
- 用回溯法链表求解迷宫问题
- 【数据结构】用回溯法求解迷宫问题
- 回溯法迷宫求解
- 数据结构学习之回溯法求解迷宫问题
- 回溯算法基础---皇后问题,骑士游历,迷宫求解
- 用回溯法求解N皇后和迷宫问题
- 迷宫问题 回溯法
- 回溯算法---迷宫问题
- 回溯法-迷宫问题
- 迷宫问题回溯算法
- 回溯--迷宫问题
- 回溯算法经典应用:迷宫求解
- 迷宫求解(C语言回溯法)
- 迷宫求解问题
- 递归求解迷宫问题
- 迷宫问题求解
- 如何使用友盟统计(自定义事件)
- Android studio修改IDE背景颜色
- RDKit:计算不同分子或构象之间的RMSD
- 为什么三大电信运营商能够肆无忌惮的赚取用户的钱
- jQuery基础
- 回溯求解-迷宫问题
- 11.20(1)
- Python机器学习库sklearn网格搜索与交叉验证
- 计算机视觉-椒盐噪声输出
- anaconda在windows系统上的报错修复
- 超级详细的仿QQ滑动删除的效果
- 用Go语言打造区块链[1]
- 微信公众号的开发学习《1》
- Redis安装系统服务1073错误