迷宫问题
2016-06-11 18:52
169 查看
下面是用穷举法来走迷宫
走迷宫的规则:当前坐标是(i, j)下一步可以往四个方向行走,上下左右。
在迷宫数组 0标识可以走,1标识不能走 2 标识已经走过 3标识回退的路
穷举法走出迷宫有两种方法:
1 栈
2 递归
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/7E/E3/wKiom1cLpVvwPA-eAAAe0ibpZXg498.png" title="Image [2].png" alt="wKiom1cLpVvwPA-eAAAe0ibpZXg498.png" />
下面通过栈的回溯解决迷宫问题,具体实现如下:
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/7E/E0/wKioL1cLo7mTCItCAAAkqmgc1ow432.png" title="Image [2].png" alt="wKioL1cLo7mTCItCAAAkqmgc1ow432.png" />
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1762764
走迷宫的规则:当前坐标是(i, j)下一步可以往四个方向行走,上下左右。
在迷宫数组 0标识可以走,1标识不能走 2 标识已经走过 3标识回退的路
穷举法走出迷宫有两种方法:
1 栈
2 递归
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/7E/E3/wKiom1cLpVvwPA-eAAAe0ibpZXg498.png" title="Image [2].png" alt="wKiom1cLpVvwPA-eAAAe0ibpZXg498.png" />
下面通过栈的回溯解决迷宫问题,具体实现如下:
= ch - '0'; j++; } } } } //判断迷宫是否可以走出去,利用栈存放和回溯实现 bool SerachMazePath(int* a, Pos entry, stack<Pos>& paths) {//该迷宫0为通路,1标识为死路,2标识已经走过,3标识回退的路 assert(a); paths.push(entry); while (!paths.empty()) { Pos cur = paths.top(); //走过的标记为2 a[cur._row*M + cur._col] = 2; //检查是否到达出口 if (cur._row == N - 1 || cur._col == M - 1) { return true; } Pos next = cur; //向左走 if (cur._col - 1 >= 0 && a[cur._row*M + cur._col - 1] == 0) { next._col--; paths.push(next); continue; } //向右走 if (cur._col + 1 < M && a[cur._row*M + cur._col + 1] == 0) { next._col++; paths.push(next); continue; } //向上走 if ((cur._row - 1) >= 0 && a[(cur._row - 1) * M + cur._col] == 0) { next._row--; paths.push(next); continue; } //向下走 if (cur._row + 1<N && a[(cur._row + 1) * M + cur._col] == 0) { next._row++; paths.push(next); continue; } paths.pop();//回溯 a[cur._row*M + cur._col] = 3; } return false; } void Print(int* a) { assert(a); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cout << a[i*M + j] << ]递归实现如下:结果如下所示://判断迷宫是否可以走出去,利用递归实现 //递归的实现相比较栈减少在回溯时的重复比较,但递归会一直回退到入口处结束 int SerachMazePath(int* a,Pos entry) {//该迷宫0为通路,1标识为死路,2标识已经走过,3标识回退的路 assert(a); Pos cur = entry; //走过的标记为2 a[cur._row*M + cur._col] = 2; Pos next = cur; //检查是否到达出口 if (cur._row != N - 1 && cur._col != M - 1) { //向左走 if (cur._col - 1 >= 0 && a[cur._row*M + cur._col - 1] == 0) { next = cur; next._col--; if(SerachMazePath(a, next)) return 1; a[next._row*M + next._col] = 3; } //向右走 if (cur._col + 1 < M && a[cur._row*M + cur._col + 1] == 0) { next = cur; next._col++; if(SerachMazePath(a, next)) return 1; a[next._row*M + next._col] = 3; } //向上走 if ((cur._row - 1)>=0 && a[(cur._row - 1) * M + cur._col] == 0) { next = cur; next._row--; if(SerachMazePath(a, next)) return 1; a[next._row*M + next._col] = 3; } //向下走 if (cur._row + 1<N && a[(cur._row + 1) * M + cur._col] == 0) {//注意在每进行一步时都需要将next重置,防止一处递归出来后再走某步递归出错 next = cur; next._row++; if(SerachMazePath(a, next)) return 1; a[next._row*M + next._col] = 3; } return 0; } else return 1; }测试用例如下:
void Test1()
{
int *sm = new int[N * M];
Pos entry;
stack<Pos> paths;
entry._row = 2; //迷宫入口处
entry._col = 0;
GetMase(sm);
cout << "是否找到通路:" << SerachMazePath(sm, entry, paths) << endl;
Print(sm);
}
void Test2()
{
int *sm = new int[N * M];
Pos entry;
entry._row = 2; //迷宫入口处
entry._col = 0;
GetMase(sm);
Print(sm);
cout << "是否找到通路:" << SerachMazePath(sm, entry) << endl;
Print(sm);
}
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/7E/E0/wKioL1cLo7mTCItCAAAkqmgc1ow432.png" title="Image [2].png" alt="wKioL1cLo7mTCItCAAAkqmgc1ow432.png" />
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1762764
相关文章推荐
- mongodb的基本操作与插入文档(document)
- 360
- 经典问题之最大子矩阵
- 判断一个字符串是否为另外一个字符串旋转之后的字符串
- 字符串和对应的整数之间的转换
- 编写一个函数itob(),将整数n转换为以b进制的数,保存到s中
- 二维数组中的查找—杨氏矩阵
- 编写一个函数将参数字符串中的字符反向排列
- 在终端输入多行信息,找出包含“ould”的行,并打印改行
- 编写冒泡排序,排序一个整形数组
- 模拟实现printf
- 调整数组使奇数全部都位于偶数前面
- 找出数组中两个只出现了一次的数
- 实现常用字符串处理函数(不调用库函数)
- strlen函数的多种实现方式
- 编写冒泡排序,可以排序整形数组,也可以排序字符串
- 实现一个简易通讯录
- 注释转换
- 排序算法比较
- 顺序表一系列操作