回溯法求解迷宫问题
题目
这是我在老师发的PPT上发现的一道题,如下
1表示起点 7表示终点,一共六个路口,每个路口可以通达最多左上右三个路口,不能走的方向用0表示,求从1到7的路径。
求解思路:每个路口最多有三个搜索分支。把算法设计为如下的搜索过程:把整个搜索分解为向左、向前和向右三个方向上子问题的搜索。
当搜索到某个路口,发现该路口没有可搜索的方向时,就让搜索过程回溯到该路口的前一个路口,然后搜索这个路口的其他尚未搜索过的搜索方向。
样的搜索过程一直继续到找到出口或搜索完全部可连通路口的所有可能搜索方向没有找到出口为止。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int ro[100];//记录走过的路径 4 int k=-1;//路口数目 5 int flag=1; 6 int road(int a[][3],int m){ 7 k++;//没经过一乐路口k就加1 8 for(int i=0;i<3;i++){ 9 if(flag==0){//遇到终点结束 10 break; 11 } 12 if(a[m][i]==7){//找到终点输出走过的路径 13 cout <<"存在出口在"<<m +1<<"行"<<i+1<<"列" << endl; 14 cout<<"路径为" << "1" <<" "; 15 for(int s=0;s<k;s++){ 16 cout <<ro[s]+1 << " " ; 17 } 18 flag=0;//表示探索结束 19 } 20 if(a[m][i]!=0){//探索路径 21 ro[k]=a[m][i]-1; 22 road(a,ro[k]);//递归下一个路口 23 } 24 else{ 25 continue;//遇到0即没有路了跳过 26 } 27 } 28 k--;//该条路径不行,回溯到前一个路口 29 return 1; 30 } 31 int main() 32 { 33 int a[6][3]; 34 for(int i=0;i<6;i++){ 35 for(int j=0;j<3;j++){ 36 cin >> a[i][j]; 37 } 38 } 39 road(a,0); 40 return 0; 41 }
总结:该代码以PPT上的迷宫而写的,只需改一下参数便可以轻易扩展到一般的情况。
作者:你的雷哥
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!