#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++回溯法走迷宫的更多相关文章

  1. python 回溯法 子集树模板 系列 —— 2、迷宫问题

    问题 给定一个迷宫,入口已知.问是否有路径从入口到出口,若有则输出一条这样的路径.注意移动可以从上.下.左.右.上左.上右.下左.下右八个方向进行.迷宫输入0表示可走,输入1表示墙.为方便起见,用1将 ...

  2. 算法之--回溯法-迷宫问题【python实现】

    题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0,  ...

  3. C语言递归回溯法迷宫求解

    本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...

  4. P1605 迷宫 dfs回溯法

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  5. 回溯法求解n皇后和迷宫问题

    回溯法是一种搜索算法,从某一起点出发按一定规则探索,当试探不符合条件时则返回上一步重新探索,直到搜索出所求的路径. 回溯法所求的解可以看做解向量(n皇后坐标组成的向量,迷宫路径点组成的向量等),所有解 ...

  6. 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)

    1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...

  7. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  8. python 回溯法 子集树模板 系列 —— 18、马踏棋盘

    问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...

  9. python 回溯法 记录

    一直不是太理解回溯法,这几天集中学习了一下,记录如下. 回溯法有"通用的解题法"之称. 1.定义:  也叫试探法,它是一种系统地搜索问题的解的方法. 2.基本思想:  从一条路往前 ...

随机推荐

  1. [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 ...

  2. HDU 2732:Leapin' Lizards(最大流)

    http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意:给出两个地图,蜥蜴从一个柱子跳跃到另外一个地方,那么这个柱子就可能会坍塌,第一个地图是柱子可以容忍跳 ...

  3. jQuery基本操作

    jQuery简介 jQuery是一个兼容多浏览器的javascript库,极大地简化了 JavaScript 编程,核心理念是write less,do more(写得更少,做得更多),对javasc ...

  4. MySQL使用规范

    一.    表设计类 强制类规范 1. 创建表的存储引擎必须是InnoDB. 2. 每个表必须显式的指定一个主键. 3. 不允许使用联合主键. 4. 不允许使用外键. 5. 不允许存在和主键重复的索引 ...

  5. Java中ProcessBuilder应用实例

    系列说明 浅析Java.lang.Runtime类 浅析Java.lang.Process类 浅析Java.lang.ProcessBuilder类 可以使用java中的ProcessBuilder执 ...

  6. 7. LAMP环境搭建

    一.准备工作 1.安装编译工具gcc.gcc-c++ 注意解决依赖关系,推荐使用yum安装,若不能联网可使用安装光盘做为yum源-- 1)编辑yum配置文件: # mount /dev/cdrom / ...

  7. C# 调用存储过程操作 OUTPUT参数和Return返回值

    本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html 存储过程是存放在数据库服务器上的预先编译好的sql语句.使用存 ...

  8. JavaScript的apply()方法和call()方法

    1 <script type="text/javascript"> 2 /*定义一个人类*/ 3 function Person(name,age) 4 { 5 thi ...

  9. Android 进程常驻----开机广播的简单守护以及总结

    这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到 ...

  10. shell技巧

    如何实现Shell脚本以DEAMON的方式运行,即实现Shell版的Fork if [ "$1" != 'background' ] ; then scriptdir=$(cd & ...