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.基本思想: 从一条路往前 ...
随机推荐
- jdbc的实例应用:增删查改实现
//在jdbc中进行增删查改 //查看所有 public static void findAll() { String url = "jdbc:mysql://localhost:3306/ ...
- 笔记汇总.md
```javascript 1.js对象,value的值取不到,试着将引入的js文件放到body的后面 $("input[type='time']").change( functi ...
- RK 61 键盘 Ubuntu 下键位映射修改方案
在用户 Home 目录下面创建 .Xmodmap 文件,然后输入以下的内容: remove Lock = Caps_Lock remove Control = Control_L remove Con ...
- win7和u盘redhat7.1双系统安装总结
最近win7系统越用越卡,又没钱买mac只能想办法装以下linux系统,听说redhat服务器用的比较多,就想尝试一下装一个redhat.当然,和所有人一样,搜索了很多资料.我选择装双系统,因为要抛弃 ...
- JDBC三层架构
三层框架: 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了“高内聚,低耦合”的思想. 原理:1:数据访问层:主要是对原始 ...
- 关于js的闭包
http://kb.cnblogs.com/page/110782/ http://www.cnblogs.com/xiaotie/archive/2011/08/03/2126145.html
- C#字节数组转换成字符串
C#字节数组转换成字符串 如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了.为了进行这样的转换,我们不得不借助另一个类:System.Text.Enc ...
- http cookie相关
http://www.webryan.net/2011/08/wiki-of-http-cookie/
- oracle过滤字母
select regexp_replace(col,'[A-Za-z]') from dual; --> 12345col 列名
- Jenkins + maven + Git+selenium
1.在Jenkins中配置Maven与Git 1)在系统管理>管理插件>可选插件 页面分别下载Git plugin 与 Maven Integration plugin插件,安装完成后再已 ...