本例将随机产生一个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. [译]Java 垃圾回收的监控和分析

    说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Monitoring and Analysi 在这个系列的Java垃圾回收教程中,我们将看到可用于垃圾 ...

  2. js实现tooltip动态提示效果(文字版)

    页面中经常用到鼠标移动到一个元素上面显示提示的功能,最开始的做法是在下面创建一个div然后动态显示这个div,但是这样需要加很多div,比较麻烦. 针对上面个的需求,这边写了一个tooltip动态提示 ...

  3. php中的$_GET怎样获取带有井号“#”的參数

    <?php echo $_GET['key']; ?> 当url为http://test.com/c.php?key=999时,正常输出:999 当url为http://test.com/ ...

  4. fscanf功能具体解释

    cfscanf fscanf fscanf : 格,fscanf格格 :int fscanf(FILE *stream, char *format,[argument...]); int fscanf ...

  5. SWAT—Samba WEB管理工具

    本文试验环境是RHEL5.2+samba-swat-3.0.28.Server的IP是192.168.120.241.   1. swat介绍 SWAT:The Samba WEB Administr ...

  6. c#、sql、asp.net、js、ajax、jquery大学知识点笔记

    <table cellSpacing="0" cellPadding="0" width="609" height="470 ...

  7. Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等

    count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age ...

  8. CHD4 impala安装配置

    impala基于CHD,提供针对HDFS,hbase的实时查询,查询语句类似于hive 包括几个组件 Clients:提供Hue, ODBC clients, JDBC clients, and th ...

  9. SQLSERVER利用FOR XML PATH实现分组拼接字符串

    首先看一下数据结构表 IF(OBJECT_ID('tempdb..#tProduct')IS NOT NULL) DROP TABLE #tProduct SELECT * INTO #tProduc ...

  10. [转]SVN操作手册

    [转]SVN操作手册 2012-04-28 11:26 by NewSea, 2495 阅读, 0 评论, 收藏, 编辑 原文: http://hi.baidu.com/caiqiupeng/blog ...