前言
玩转算法系列本着带你轻松领略算法的乐趣的宗旨,本人利用业余时间更新,喜欢的可以支持一下。
好,言归正传。大家在生活中可能见过迷宫也可能亲身体验过迷宫,知道迷宫的最大特征就是进去易,出来难。本篇文章就带你体验如何利用递归算法探索迷宫的出路。
下面是运行效果
本程序采用c/c++
编写,gcc
编译器。
首先我们先来定义一个迷宫,采用二维数组,1表示墙,0表示路。
int a[maxsize][maxsize]={
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//1
{
0,0,1,1,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,1},//2
{
1,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1},//3
{
1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,0,1,0,1},//4
{
1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1},//5
{
1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,1,0,1,0,1},//6
{
1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,0,1,1,1},//7
{
1,0,1,0,1,1,1,0,1,1,1,0,1,0,1,1,0,0,0,1},//8
{
1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,1,0,1,1,1},//9
{
1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1},//10
{
1,0,1,0,1,0,0,0,0,0,1,1,1,0,1,1,0,1,0,1},//11
{
1,0,1,0,1,0,1,1,1,0,0,0,0,0,1,1,0,1,0,1},//12
{
1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1},//13
{
1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,0,1,0,1},//14
{
1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,1},//15
{
1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,0,1},//16
{
1,0,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,0,1},//17
{
1,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,1,0,1},//18
{
1,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},//19
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}//20
};
效果即像下面这样
然后就是我们本章的重点了,如何利用递归算法寻找从迷宫的左上角的缺口到达右下角的缺口的路径,并把他们记录下来,就像下面这样:
图片看不清的话下面有代码
这是第1条路径,长度为:65
(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(6,1)->(7,1)->(8,1)->(9,1)->(10,1)->(11,1)->(12,1)->(13,1)->(14,1)->(14,2)->(14,3)->(14,4)->(14,5)->(13,5)->(12,5)->(11,5)->(10,5)->(10,6)->(10,7)->(10,8)->(10,9)->(11,9)->(11,10)->(11,11)->(11,12)->(11,13)->(10,13)->(9,13)->(8,13)->(7,13)->(6,13)->(5,13)->(4,13)->(4,14)->(3,14)->(2,14)->(1,14)->(1,15)->(1,16)->(2,16)->(3,16)->(4,16)->(5,16)->(6,16)->(7,16)->(8,16)->(9,16)->(10,16)->(11,16)->(12,16)->(13,16)->(14,16)->(15,16)->(16,16)->(17,16)->(18,16)->(18,17)->(18,18)->(18,19)->(0,0)->
这是第2条路径,长度为:74
(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(6,1)->(7,1)->(8,1)->(9,1)->(10,1)->(11,1)->(12,1)->(13,1)->(14,1)->(14,2)->(14,3)->(14,4)->(14,5)->(13,5)->(12,5)->(11,5)->(10,5)->(10,6)->(10,7)->(10,8)->(10,9)->(11,9)->(11,10)->(11,11)->(11,12)->(12,11)->(13,11)->(14,11)->(14,12)->(14,13)->(14,14)->(13,14)->(12,14)->(12,13)->(11,13)->(10,13)->(9,13)->(8,13)->(7,13)->(6,13)->(5,13)->(4,13)->(4,14)->(3,14)->(2,14)->(1,14)->(1,15)->(1,16)->(2,16)->(3,16)->(4,16)->(5,16)->(6,16)->(7,16)->(8,16)->(9,16)->(10,16)->(11,16)->(12,16)->(13,16)->(14,16)->(15,16)->(16,16)->(17,16)->(18,16)->(18,17)->(18,18)->(18,19)->(0,0)->
这是第3条路径,长度为:73
(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(6,1)->(7,1)->(8,1)->(9,1)->(10,1)->(11,1)->(12,1)->(13,1)->(14,1)->(14,2)->(14,3)->(14,4)->(14,5)->(13,5)->(12,5)->(11,5)->(10,5)->(10,6)->(10,7)->(10,8)->(10,9)->(9,7)->(8,7)->(7,7)->(6,7)->(5,7)->(4,7)->(4,6)->(3,6)->(2,6)->(1,6)->(1,7)->(1,8)->(1,9)->(2,9)->(3,9)->(4,9)->(4,10)->(4,11)->(4,12)->(4,13)->(4,14)->(3,14)->(2,14)->(1,14)->(1,15)->(1,16)->(2,16)->(3,16)->(4,16)->(5,16)->(6,16)->(7,16)->(8,16)->(9,16)->(10,16)->(11,16)->(12,16)->(13,16)->(14,16)->(15,16)->(16,16)->(17,16)->(18,16)->(18,17)->(18,18)->(18,19)->(18,14)->
这是第4条路径,长度为:74
(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(6,1)->(7,1)->(8,1)->(9,1)->(10,1)->(11,1)->(12,1)->(13,1)->(14,1)->(14,2)->(14,3)->(14,4)->(14,5)->(13,5)->(12,5)->(11,5)->(10,5)->(10,6)->(10,7)->(10,8)->(10,9)->(9,7)->(8,7)->(7,7)->(6,7)->(5,7)->(4,7)->(4,6)->(3,6)->(2,6)->(1,6)->(1,