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

来源:互联网 发布:优品课堂python百度云 编辑:程序博客网 时间:2024/06/05 06:57

前言

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("显示迷宫:\n");    for(i = 0; i < 7; i++) {        for(j = 0; j < 7; j++)            if(maze[i][j] == 2)                printf("█");        else            printf(" ");        printf("\n");    }    if(visit(startI, startJ) == 0)        printf("\n没有找到出口!\n");    else    {        printf("\n显示路径:\n");        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("\n");        }    }    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;}

拓展和关联

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

后记

参考书籍

  • 《经典算法大全》
  • 维基百科
0 0
原创粉丝点击