C++回溯法走迷宫
- #include <iostream>
- #include <iomanip>
- #include <cstdlib>
- using namespace std;
- #define MaxSize 100
- int maze[10][10] = //定义一个迷宫,0表示通道,1表示墙
- {
- {1,1,1,1,1,1,1,1,1,1},
- {1,0,0,1,1,0,0,1,0,1},
- {1,0,0,1,0,0,0,1,0,1},
- {1,0,0,0,0,1,1,0,0,1},
- {1,0,1,1,1,0,0,0,0,1},
- {1,0,0,0,1,0,0,0,0,1},
- {1,0,1,0,0,0,1,0,0,1},
- {1,0,1,1,1,0,1,1,0,1},
- {1,1,0,0,0,0,0,0,0,1},
- {1,1,1,1,1,1,1,1,1,1}
- };
- struct Try //定义一个栈,保存路径
- {
- int i; //当前方块的行号
- int j; //当前广场的列号
- int d; //di是下一可走方位的方位号
- } path[MaxSize]; //定义栈
- int top = -1; //初始化栈指针
- void findPath(int xb, int yb, int xe, int ye) //路径为从(xb,yb)到(xe,ye)
- {
- int i, j, d, find, k;
- top++; //初始方块进栈
- path[top].i = xb;
- path[top].j = yb;
- path[top].d = -1;
- maze[xb][yb] = -1;
- while(top>-1) //栈不为空时循环
- {
- i = path[top].i;
- j = path[top].j;
- d = path[top].d;
- if(i==xe && j==ye) //找到了出口,输出路径
- {
- cout << "迷宫路径如下:\n";
- for(k=0; k<=top; k++)
- {
- cout << "\t(" << path[k].i << "," << path[k].j << ")";
- if((k+1)%5==0) cout << endl; //每输出五个方块后换一行
- }
- cout << endl;
- return;
- }
- find = 0;
- while(d<4 && find==0) //找下一个可走的点
- {
- d++;
- switch(d)
- {
- case 0: //向上
- i = path[top].i-1;
- j = path[top].j;
- break;
- case 1: //向右
- i = path[top].i;
- j = path[top].j+1;
- break;
- case 2: //向下
- i = path[top].i+1;
- j = path[top].j;
- break;
- case 3: //向左
- i = path[top].i;
- j = path[top].j-1;
- break;
- }
- if(maze[i][j]==0) find = 1; //找到通路
- }
- if(find==1) //找到了下一个可走方块
- {
- path[top].d = d; //修改原栈顶元素的d值
- top++; //下一个可走方块进栈
- path[top].i = i;
- path[top].j = j;
- path[top].d = -1;
- maze[i][j] = -1; //避免重复走到这个方块
- //cout << "\t(" << path[top].i << "," << path[top].j << ")"; //显示经过的试探
- }
- else //没有路可走,则退栈
- {
- maze[path[top].i][path[top].j] = 0; //让该位置变成其它路径可走方块
- top--;
- }
- }
- cout << "没有可走路径!\n";
- }
- int main()
- {
- findPath(1,1,8,8); //从(1,1)入,(8,8)出
- return 0;
- }
C++回溯法走迷宫的更多相关文章
- python 回溯法 子集树模板 系列 —— 2、迷宫问题
问题 给定一个迷宫,入口已知.问是否有路径从入口到出口,若有则输出一条这样的路径.注意移动可以从上.下.左.右.上左.上右.下左.下右八个方向进行.迷宫输入0表示可走,输入1表示墙.为方便起见,用1将 ...
- 算法之--回溯法-迷宫问题【python实现】
题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, ...
- C语言递归回溯法迷宫求解
本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...
- P1605 迷宫 dfs回溯法
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 回溯法求解n皇后和迷宫问题
回溯法是一种搜索算法,从某一起点出发按一定规则探索,当试探不符合条件时则返回上一步重新探索,直到搜索出所求的路径. 回溯法所求的解可以看做解向量(n皇后坐标组成的向量,迷宫路径点组成的向量等),所有解 ...
- 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)
1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...
- 洛谷P1238 走迷宫
洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...
- python 回溯法 子集树模板 系列 —— 18、马踏棋盘
问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...
- python 回溯法 记录
一直不是太理解回溯法,这几天集中学习了一下,记录如下. 回溯法有"通用的解题法"之称. 1.定义: 也叫试探法,它是一种系统地搜索问题的解的方法. 2.基本思想: 从一条路往前 ...
随机推荐
- httpd 安装
官网地址:http://httpd.apache.org/docs/2.4/ Download Download the latest release from http://httpd.apache ...
- JAVA实现国际化
1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...
- 一个jQ版大图滚动
难得周末能休息,也是越发的代码难受,手就想敲点东西,这不闲着无聊敲了一个Jq版的大图滚动,不足之处大家批评指正: 运作环境win7,代码编辑器是:sublime; 我把源码复制了一下, <!do ...
- Mac OSX上的软件包管理工具,brew 即 Homebrew
brew 即 Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 只需要一个命令, 非常方便. brew类似ubuntu系统下的apt-get的功能. 安装 ...
- Mac 快捷键
总结一下: Ctrl + 关机:弹出关机提示 Ctrl + Opt + 关机 : 正常关机快捷键 Cmd + Opt + 关机 :休眠 Ctrl + Cmd + 关机:重启 Shift + Ctrl ...
- python之RabbitMQ
一.安装RabbitMQ 1. 安装erlang 1 2 3 4 tar xf otp_src_18.3.tar.gz cd otp_src_18.3 ./configure --prefix=/ma ...
- ProcessBuilder 、Runtime和Process 的区别
1.版本原因 ProcessBuilder是从java1.5加进来的,而exec系列方法是从1.0开始就有的,后续版本不断的重载这个方法,到了1.5已经有6个之多. 2.ProcessBuilder. ...
- jQuery学习笔记(三)jQuery中的事件
目录 加载DOM 事件绑定 合成事件 事件冒泡 移除事件 一.加载DOM Javascript 与HTML之间的交互是通过用户操作浏览器页面引发的事件来处理的.jQuery提供了丰富的事件处理机制.从 ...
- mysql查看修改字符集
1.列出MYSQL支持的所有字符集: SHOW CHARACTER SET; 2.当前MYSQL服务器字符集设置 SHOW VARIABLES LIKE 'character_set_%'; 3.当前 ...
- I2S/PCM/IOM-2、I2C/SPI/UART/GPIO/slimbus
概述 I2S,PCM,IOM-2都是数字音频接口,传数据的. I2C,SPI,UART,GPIO是控制接口,传控制信令的. I2S I2S(Inter-IC Sound Bus)是飞利浦公司为数字音频 ...