本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法。

解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左。

不少人求解此题时运用的栈的相关知识,本例寻找线路的过程不运用进栈出栈,而是用回溯法“抹去”判断不行的线路。

话不多说,上代码。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>//包括根据当前时间产生随机数的函数
static int maze[][];
//创建迷宫
int creatmaze()
{
srand((unsigned)time(NULL));
for(int i=; i<; i++)
{
for(int j=; j<; j++)
{
if((i==&&j==)||(i==&&j==))
maze[i][j]=;
else
maze[i][j]=rand()%;//为保证墙的数目较少,产生的随机数1为墙,0和2为路
if(maze[i][j]==)
maze[i][j]=;
if(maze[i][j]==||i==||i==||j==||j==)//迷宫框架为墙
{
maze[i][j]=;
printf(" O ");
}
else
printf(" ");
}
printf("\n");
}
printf("\n");
}
//输出线路(结果)
void printroute()
{
for(int i=; i<; i++)
{
for(int j=; j<; j++)
{
if(maze[i][j]==)
printf(" O ");
else if(maze[i][j]==)
printf(" ");
else if(maze[i][j]==)
printf(" X ");
}
printf("\n");
}
}
//寻找线路
void findroute(int i,int j)
{
if(i==&&j==)//边界条件,即找到出路
{
printroute();
exit();
}
else
{
if(maze[i][j+]!=&&maze[i][j+]!=)//判断当前位置右边是否为墙(下同理)
{
maze[i][j]=;//将2作为线路的标志
j++;
findroute(i,j);//递归
j--;//回溯
maze[i][j]=;
}
if(maze[i+][j]!=&&maze[i+][j]!=)//下
{
maze[i][j]=;
i++;
findroute(i,j);
i--;
maze[i][j]=;
}
if(maze[i-][j]!=&&maze[i-][j]!=)//上
{
maze[i][j]=;
i--;
findroute(i,j);
i++;
maze[i][j]=;
}
if(maze[i][j-]!=&&maze[i][j-]!=)//左
{
maze[i][j]=;
j--;
findroute(i,j);
j++;
maze[i][j]=;
}
if(i==&&j==&&maze[][]==&&maze[][]==)//此处用于判断入口右方和下方是否为通路,若两处均有墙则直接输出无路
{
printf("no way\n");
exit();
}
}
} int main()
{
creatmaze();
findroute(,);
printf("no way\n");//没有找到出路
}

样例输出:

C语言递归回溯法迷宫求解的更多相关文章

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

    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语言

    r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...

  4. 递归回溯法求N皇后问题

    问题描述:在一个NN(比如44)的方格中,在每一列中放置一个皇后,要求放置的皇后不在同一行,同一列,同一斜线上,求一共有多少种放置方法,输出放置的数组. 思路解析:从(1,1)开始,一列一列的放置皇后 ...

  5. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

  6. 从Leetcode的Combination Sum系列谈起回溯法

    在LeetCode上面有一组非常经典的题型--Combination Sum,从1到4.其实就是类似于给定一个数组和一个整数,然后求数组里面哪几个数的组合相加结果为给定的整数.在这个题型系列中,1.2 ...

  7. 使用回溯法解批处理作业调度问题<算法分析>

    一.实验内容及要求 1.要求用回溯法原理求解问题: 2.要求手工输入t1[10]及t2[10],t1[i]是任务i在机器1上的执行时间,t2[i]是任务i在机器2上的执行时间: 3.求出最优批处理作业 ...

  8. Java算法——回溯法

    回溯法一种选优搜索法,又称试探法.利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解.搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向 ...

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

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

随机推荐

  1. C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题

    如果说你编译的exe运行时报错: “尝试读取或写入受保护的内存.这通常指示其他内存已损坏” 这很有可能是你是以非托管的方式错误地引用了64位的API中去. 为什么会这样? 那你就要考虑VS的编译器选项 ...

  2. 方向梯度直方图(HOG)和颜色直方图的一些比較

    近期在学习视频检索领域的镜头切割方面的知识,发现经常使用的方法是直方图的方法,所以才专门有时间来学习下.查看到这两种直方图的时候,感觉有点接近,好像又不同,放在这做个比較.大部分还是百科的内容,只是对 ...

  3. 成C++应用程序世界------异常处理

    一. 概述 C++自身有着很强的纠错能力,发展到现在,已经建立了比較完好的异常处理机制.C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行.还有一 ...

  4. SSMS2008插件开发(4)--自定义菜单

    原文:SSMS2008插件开发(4)--自定义菜单 打开上次的项目MySSMSAddin中的Connect类,发现该类继于了两个接口:IDTExtensibility2和IDTCommandTarge ...

  5. 打开VMware的系统出错

    打开VMware系统时,出现错误 “Invalid configuration file. File "I:/My Virtual Machines/Windows XP english P ...

  6. 【工作笔记五】html5的placeholder属性(IE如何兼容placeholder属性)

    placeholder属性,IE对其的支持表示无奈,firefox.google chrome表示毫无压力. HTML5对Web Form做了许多增强,比如input新增的type类型.Form Va ...

  7. Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...

  8. location的使用

    <script language="javascript" type="text/javascript"> function setUrl(){   ...

  9. Oracle琐碎笔记2

    备注:以下所有操作均在sqlplus中执行. 开始前输入:spool c:\jiyi.txt;结束后输入:spool off;就会记忆操作的所有记录save c:\sql.sql;保存sql脚本可以使 ...

  10. Web Components

    Web Components是不是Web的未来   今天 ,Web 组件已经从本质上改变了HTML.初次接触时,它看起来像一个全新的技术.Web组件最初的目的是使开发人员拥有扩展浏览器标签的能力,可以 ...