C++使用回溯算法解决简单迷宫问题
2016-04-12 00:42
411 查看
给你一个矩阵,如何在其中找到一条通路呢?
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/82e9f24845596d68c4a33e8617f6478e.png)
(是不是很凌乱?^_^)
在C++中怎么实现呢?
较好的解决方案:使用栈解决。
解决思路:
使用FILE*和open预先打开文件(绝对路径和相对路径1),注意断言。
正确读取文件,判断字符和空格,空格略过,读取字符。
从入口进入,每走一步,判断上下左右4个方向有无道路。
如果4个方向有路,则按次序先进入其中一条(将字符压栈push),并将所走过字符重置数字(后面回溯)。
如果4个方向没有,则出栈pop,即回溯,并再次判断。
逐次循环,直至判断下一个有效节点为边界时出栈,此时重置数字的路径即为通路。
注释:
1. 相对路径和绝对路径:绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe相对路径:是从当前路径开始的路径,假如当前路径为C:\windows要描述上述路径,只需输入system32\cmd.exe。实际上,严格的相对路径写法应为.\system32\cmd.exe其中,.表示当前路径,在通道情况下可以省略,只有在特殊的情况下不能省略。
2. 此次实现中为简单实现采用相对路径,将写好的“迷宫”放在同一项目文件下进行打开即可
下面为C++代码的简单实现:
预处理:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/a17808f225053711a24e95bf82f670d5.png)
预先打开文件及处理字符
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/647cc3042fcc5b99787dcaf6143186bf.png)
从入口节点开始判断:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/d1e1c04dbc3dc428a50144209c4ec62c.png)
回溯算法:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/1ccde09d322872e6cb6db859f12dd17a.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/02692c857975cd93def5d2640e86c23f.png)
最后一步,测试单元:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/f61a4713304a3f865b6db727ab4e8d3a.png)
哈哈!完成,开始测试。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/20583b4acdaf25c117cc0cc1648037ac.png)
似乎很成功哦!但是并没有测试另一条路径(虽然不同),把刚才函数的上下左右重新调整一下,再运行:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/6634372a47e6073f9a20bcaab1186244.png)
依旧成功!
此时,就算我们的迷宫问题就算小小的解决了吧,当然,有兴趣的童鞋可以再加探索,比如如何达到最短测试路径等。就不在此一一深究了。毕竟这个看似小小的程序也是小弟耗费一番心思的成品,谢谢大家的阅读啦!有兴趣可以关注哦!嘿嘿。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/82e9f24845596d68c4a33e8617f6478e.png)
(是不是很凌乱?^_^)
在C++中怎么实现呢?
较好的解决方案:使用栈解决。
解决思路:
使用FILE*和open预先打开文件(绝对路径和相对路径1),注意断言。
正确读取文件,判断字符和空格,空格略过,读取字符。
从入口进入,每走一步,判断上下左右4个方向有无道路。
如果4个方向有路,则按次序先进入其中一条(将字符压栈push),并将所走过字符重置数字(后面回溯)。
如果4个方向没有,则出栈pop,即回溯,并再次判断。
逐次循环,直至判断下一个有效节点为边界时出栈,此时重置数字的路径即为通路。
注释:
1. 相对路径和绝对路径:绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe相对路径:是从当前路径开始的路径,假如当前路径为C:\windows要描述上述路径,只需输入system32\cmd.exe。实际上,严格的相对路径写法应为.\system32\cmd.exe其中,.表示当前路径,在通道情况下可以省略,只有在特殊的情况下不能省略。
2. 此次实现中为简单实现采用相对路径,将写好的“迷宫”放在同一项目文件下进行打开即可
下面为C++代码的简单实现:
预处理:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/a17808f225053711a24e95bf82f670d5.png)
预先打开文件及处理字符
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/647cc3042fcc5b99787dcaf6143186bf.png)
从入口节点开始判断:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/d1e1c04dbc3dc428a50144209c4ec62c.png)
回溯算法:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/1ccde09d322872e6cb6db859f12dd17a.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/02692c857975cd93def5d2640e86c23f.png)
最后一步,测试单元:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/f61a4713304a3f865b6db727ab4e8d3a.png)
哈哈!完成,开始测试。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/20583b4acdaf25c117cc0cc1648037ac.png)
似乎很成功哦!但是并没有测试另一条路径(虽然不同),把刚才函数的上下左右重新调整一下,再运行:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/04/6634372a47e6073f9a20bcaab1186244.png)
依旧成功!
此时,就算我们的迷宫问题就算小小的解决了吧,当然,有兴趣的童鞋可以再加探索,比如如何达到最短测试路径等。就不在此一一深究了。毕竟这个看似小小的程序也是小弟耗费一番心思的成品,谢谢大家的阅读啦!有兴趣可以关注哦!嘿嘿。
相关文章推荐
- c++实验3-多分段函数求值
- c++第三次实验(定期存款利息计算器)
- C语言小问题记录
- c++实验三--个人所得税计算器
- C++作业3
- 【使用CMake组织C++工程】2:CMake 常用命令和变量
- C 【进制查表法 求取给定十进制数的其他进制形式数值】
- C++实验3-1-个人所得税计算器
- 作业:C++作业3
- Worktile 移动团队如何使用 C++ 完成跨平台应用开发
- emacs中完成c++程序编译执行
- C++ Primer 5th - 2.1 基础内建类型
- C/C++拷贝文件的方法
- VS2010的C++项目属性
- c++作业03
- c++第三次实验-1
- c++第三次实验-1
- c++第三次实验作业
- c++实验三-计算税收及收入
- C 【冒泡 选择排序 & 折半查找】