前言
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)
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;
}
void visit2(
int i,
int j) {
int m, n;
maze[i][j] =
1;
if(i == endI && j == endJ) {
printf(
"\n显示路径:\n");
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(
"\n");
}
}
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://ju.6miu.com/read-669779.html