Algorithm Gossip(6) 老鼠找迷宫(2)

前言

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

提出问题

Algorithm Gossip: 老鼠找迷宫(2)

在迷宫中找到出入口的路径; 若不止一条, 那么要求输出所有的条数呢。

类似于八皇后问题的解答,只增加一行即可。

分析和解释

回溯法

代码

#include <stdio.h>
#include <stdlib.h>
int visit(int, int);
int visit2(int, int) //this is the function for this problem; 
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;
}


void visit2(int i, int j) {
    int m, n;
    maze[i][j] = 1;
    if(i == endI && j == endJ) {
        printf("
显示路径:
");
        for(m = 0; m < 9; m++) {
            for(n = 0; n < 9; n++)
                if(maze[m][n] == 2)
                    printf("█");
                else if(maze[m][n] == 1)
                    printf("◇");
                else
                    printf(" ");
            printf("
");
        }
    }
    if(maze[i][j+1] == 0) visit(i, j+1);
    if(maze[i+1][j] == 0) visit(i+1, j);
    if(maze[i][j-1] == 0) visit(i, j-1);
    if(maze[i-1][j] == 0) visit(i-1, j);
    maze[i][j] = 0;
}

”’

拓展和关联

类似递归求解的可以参阅我的消消乐小程序和八皇后问题。跟这个递归原理一样。
hlink

后记

参考书籍

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