#pragma once#define MAX_ROW 4#define MAX_COL 4typedefstruct Position
{
int _x;
int _y;
}Position;
typedefstruct Maze
{
int _map[MAX_ROW][MAX_COL];
}Maze, *PMaze;
void InitMaze(PMaze pm, intmap[][MAX_COL]);
int IsValidEntry(PMaze pm, Position entry);
int IsPass(PMaze pm, Position cur);
int IsExit(PMaze pm, Position cur, Position entry);
// 真正走迷宫函数 int _PassMaze(PMaze pm, Position entry, Position cur, PStack ps);
// 提供给用户使用的走迷宫函数,与上上个走迷宫函数的区别是:用户不用去传当前步,只需要给入口就行 void PassMaze(PMaze pm, Position entry, PStack ps);
void PrintMaze(PMaze pm, intmap[][MAX_COL]);
Maze.c
#include "stack.h"
#include "Maze.h"//打印迷宫void PrintMaze(PMaze pm)
{
int i = 0;
assert(pm);
for (; i < MAX_ROW; ++i)
{
int j = 0;
for (; j < MAX_COL; ++j)
{
printf("%d ", pm->_map[i][j]);
}
printf("\n");
}
}
//迷宫初始化,就是将地图中的值赋给迷宫void InitMaze(PMaze pm, int map[][MAX_COL])
{
int i = 0;
assert(pm);
for (; i < MAX_ROW; ++i)
{
int j = 0;
for (; j < MAX_COL; ++j)
{
pm->_map[i][j] = map[i][j];
}
}
}
//检测迷宫入口是否合法int IsValidEntry(PMaze pm, Position entry)
{
assert(pm);
//必须位于迷宫边界且值为1if ((entry._x == 0 || entry._y == 0 || entry._x == MAX_ROW - 1
|| entry._y == MAX_COL - 1) && (pm->_map[entry._x][entry._y] == 1))
return1;
return0;
}
// 检测cur位置是否是通路 int IsPass(PMaze pm, Position cur)
{
assert(pm);
//值为1且不能越界if ((cur._x >= 0 && cur._x <= MAX_ROW - 1) &&
(cur._y >= 0 && cur._y <= MAX_COL - 1) &&
pm->_map[cur._x][cur._y] == 1)
return1;
return0;
}
// 检测Cur是否在出口 int IsExit(PMaze pm, Position cur, Position entry)
{
assert(pm);
//出口位置就是处于边界值为1且不能是入口if ((cur._x == 0 || cur._y == 0 || cur._x == MAX_ROW - 1
|| cur._y == MAX_COL - 1) && (pm->_map[cur._x][cur._y] == 1)
&& ((cur._x != entry._x) || (cur._y != entry._y)))
return1;
return0;
}
// 真正走迷宫函数 int _PassMaze(PMaze pm, Position entry, Position cur, PStack ps)
{
Position next;
assert(pm);
assert(ps);
//先判断当前位置是否是通路if (IsPass(pm, cur))
{
//先入栈,再判断是不是出口,最后标记,因为如果是出口,标记完就不是1
StackPush(ps, cur);
if (IsExit(pm, cur, entry))
{
pm->_map[cur._x][cur._y] = 2;
return1;
}
pm->_map[cur._x][cur._y] = 2;
// up,直接走,进入函数后再判断是否能走通
next = cur;
next._x -= 1;
if (_PassMaze(pm, entry, next, ps))
return1;
// left
next = cur;
next._y -= 1;
if (_PassMaze(pm, entry, next, ps))
return1;
// right
next = cur;
next._y += 1;
if (_PassMaze(pm, entry, next, ps))
return1;
// down
next = cur;
next._x += 1;
if (_PassMaze(pm, entry, next, ps))
return1;
//四个方向都走不通,说明cur走错了,标记位3出栈
pm->_map[cur._x][cur._y] = 3;
StackPop(ps);
}
return0;
}
//提供给用户使用的走迷宫函数,与上个走迷宫函数的区别是:用户不用去传当前步,只需要给入口就行void PassMaze(PMaze pm, Position entry, PStack ps)
{
assert(pm);
assert(ps);
//检测入口是否合法if (!IsValidEntry(pm, entry))
{
printf("迷宫入口不合法!!!\n");
return;
}
//合法就走入迷宫
_PassMaze(pm, entry, entry, ps);
}