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.基本思想: 从一条路往前 ...
随机推荐
- [Java Web]Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors
手机客户端向服务器提交Http请求时,Tomcat抛出错误: 十二月 31, 2014 2:32:45 下午 org.apache.coyote.http11.AbstractHttp11Proces ...
- HDU 2732:Leapin' Lizards(最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意:给出两个地图,蜥蜴从一个柱子跳跃到另外一个地方,那么这个柱子就可能会坍塌,第一个地图是柱子可以容忍跳 ...
- jQuery基本操作
jQuery简介 jQuery是一个兼容多浏览器的javascript库,极大地简化了 JavaScript 编程,核心理念是write less,do more(写得更少,做得更多),对javasc ...
- MySQL使用规范
一. 表设计类 强制类规范 1. 创建表的存储引擎必须是InnoDB. 2. 每个表必须显式的指定一个主键. 3. 不允许使用联合主键. 4. 不允许使用外键. 5. 不允许存在和主键重复的索引 ...
- Java中ProcessBuilder应用实例
系列说明 浅析Java.lang.Runtime类 浅析Java.lang.Process类 浅析Java.lang.ProcessBuilder类 可以使用java中的ProcessBuilder执 ...
- 7. LAMP环境搭建
一.准备工作 1.安装编译工具gcc.gcc-c++ 注意解决依赖关系,推荐使用yum安装,若不能联网可使用安装光盘做为yum源-- 1)编辑yum配置文件: # mount /dev/cdrom / ...
- C# 调用存储过程操作 OUTPUT参数和Return返回值
本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html 存储过程是存放在数据库服务器上的预先编译好的sql语句.使用存 ...
- JavaScript的apply()方法和call()方法
1 <script type="text/javascript"> 2 /*定义一个人类*/ 3 function Person(name,age) 4 { 5 thi ...
- Android 进程常驻----开机广播的简单守护以及总结
这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到 ...
- shell技巧
如何实现Shell脚本以DEAMON的方式运行,即实现Shell版的Fork if [ "$1" != 'background' ] ; then scriptdir=$(cd & ...