Algorithm Gossip(5) 老鼠找迷宫(1)

前言

This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

提出问题

Algorithm Gossip: 老鼠找迷宫(1)

在迷宫中找到出入口的路径

分析和解释

代码

c 语言版本

#include <stdio.h>
#include <stdlib.h>
int visit(int, int);
int maze[7][7] =
{
{2, 2, 2, 2, 2, 2, 2},
{2, 0, 0, 0, 0, 0, 2},
{2, 0, 2, 0, 2, 0, 2},
{2, 0, 0, 2, 0, 2, 2},
{2, 2, 0, 2, 0, 2, 2},
{2, 0, 0, 0, 0, 0, 2},
{2, 2, 2, 2, 2, 2, 2}
};

int startI = 1, startJ = 1; // 入口
int endI = 5, endJ = 5; // 出口
int success = 0;
int main(void)
{
    int i, j;
    printf("显示迷宫:
");
    for(i = 0; i < 7; i++) {
        for(j = 0; j < 7; j++)
            if(maze[i][j] == 2)
                printf("█");
        else
            printf(" ");
        printf("
");
    }
    if(visit(startI, startJ) == 0)
        printf("
没有找到出口!
");
    else
    {
        printf("
显示路径:
");
        for(i = 0; i < 7; i++) {
            for(j = 0; j < 7; j++) {
                if(maze[i][j] == 2)
                    printf("█");
                else if(maze[i][j] == 1)
                    printf("◇");
                else
                    printf(" ");
            }
            printf("
");
        }
    }
    return 0;
}
int visit(int i, int j)
{
    maze[i][j] = 1;
    if(i == endI && j == endJ)
        success = 1;
    if(success != 1 && maze[i][j+1] == 0) visit(i, j+1);
    if(success != 1 && maze[i+1][j] == 0) visit(i+1, j);
    if(success != 1 && maze[i][j-1] == 0) visit(i, j-1);
    if(success != 1 && maze[i-1][j] == 0) visit(i-1, j);
    if(success != 1)
        maze[i][j] = 0;
    return success;
}

拓展和关联

类似递归求解的可以参阅我的消消乐小程序和八皇后问题。跟这个递归原理一样。回溯法, 八皇后的解答也有一个解和全解输出形式, 改变也很小。

后记

参考书籍

  • 《经典算法大全》
  • 维基百科
原文地址:https://www.cnblogs.com/actanble/p/6713411.html