一、思路(回溯)
我们拿个例子来举:
0 0 0 0 0 0
0 0 1 1 1 0
0 0 1 0 1 0
0 0 1 1 1 1
0 0 1 0 0 0
0 0 1 0 0 0
我们把入口改为2,接下来走过的地方依次相加,并将走过的横纵坐标入栈;
0 0 0 0 0 0
0 0 6 7 8 0
0 0 5 0 9 0
0 0 4 1 10 11
0 0 3 0 0 0
0 0 2 0 0 0
虽然我们成功走出但是这不是最近的路线,所以我们再进行出栈,每出一次进行探测,看周围有1或者大于等于自身加2的值;
0 0 0 0 0 0
0 0 6 7 8 0
0 0 5 0 7 0
0 0 4 5 6 7
0 0 3 0 0 0
0 0 2 0 0 0
此时便可发现找到最近的出口,因为此时的出栈即是路线。
二、源代码
1、Maze.h(Stack.h参考博客中的栈)
#ifndef _MAZE__H_
#define _MAZE__H_
#include "Stack.h"
#define N 6
typedef struct Pos
{
int _row;
int _col;
}Pos;
int GetPath(int maze[N][N], int row, int col);
void PrintMaze(int maze[N][N]);
#endif
2、Maze.c
#include "Maze.h"
//找迷宫路线
int GetPath(int maze[N][N], int row, int col)
{
int n = 2, tmp = 0, x = row, y = col;
maze[row][col] = n;
Stack s;
StackInit(&s, 36);
StackPush(&s, row, col);
while (StackEmpty(&s))
{
if ((row == 0 || row == N - 1 || col == 0 || col == N - 1) && row != x&&col != y)
tmp = 1;
if (maze[row - 1][col] == 1 || ((maze[row][col] + 1) < maze[row - 1][col]))
{
if (row - 1 != 0)
{
StackPush(&s, row - 1, col);
maze[--row][col] = ++n;
}
else
{
StackPop(&s);
row = StackTop(&s)._row;
col = StackTop(&s)._col;
--n;
}
}
else if (maze[row][col + 1] == 1 || ((maze[row][col] + 1) < maze[row][col + 1]))
{
if (col + 1 != N)
{
StackPush(&s, row, col + 1);
maze[row][++col] = ++n;
}
else
{
StackPop(&s);
row = StackTop(&s)._row;
col = StackTop(&s)._col;
--n;
}
}
else if (maze[row][col - 1] == 1 || ((maze[row][col] + 1) < maze[row][col - 1]))
{
if (col - 1 != 0)
{
StackPush(&s, row, col - 1);
maze[row][--col] = ++n;
}
else
{
StackPop(&s);
row = StackTop(&s)._row;
col = StackTop(&s)._col;
--n;
}
}
else if (maze[row + 1][col] == 1 || ((maze[row][col] + 1) < maze[row + 1][col]))
{
if (row + 1 != N)
{
StackPush(&s, row + 1, col);
maze[++row][col] = ++n;
}
else
{
StackPop(&s);
row = StackTop(&s)._row;
col = StackTop(&s)._col;
--n;
}
}
else
{
StackPop(&s);
row = StackTop(&s)._row;
col = StackTop(&s)._col;
--n;
}
}
return tmp;
}
//打印迷宫
void PrintMaze(int maze[N][N])
{
assert(maze);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%-3d", maze[i][j]);
}
printf("\n");
}
}