最近碰到一个需求,要求解一个迷宫问题,还不能用各种乱七八糟的数据结构以及复杂点的算法,没办法只好慢慢写了一下。随便写的,估计挺多不足,放出来备忘一下,说不定对谁有用呢。
#include<stdio.h>
char MAP[12][13] = {
"############",
"#...#......#",
"..#.#.####.#",
"###.#....#.#",
"#....###.#..",
"####.#.#.#.#",
"#..#.#.#.#.#",
"##.#.#.#.#.#",
"#........#.#",
"######.###.#",
"#......#...#",
"############"
};
void printMap(const char map[][13])
{
for (int i = 0; i < 12; puts(map[i++]));
puts("");
}
int check(const char map[][13], int x0, int y0)
{
return
(x0 != 0 && map[x0 - 1][y0] != '#' && map[x0 - 1][y0] != 'X') +
(x0 != 11 && map[x0 + 1][y0] != '#' && map[x0 + 1][y0] != 'X') +
(y0 != 0 && map[x0][y0 - 1] != '#' && map[x0][y0 - 1] != 'X') +
(y0 != 11 && map[x0][y0 + 1] != '#' && map[x0][y0 + 1] != 'X');
}
int move(char map[][13], int x0, int y0)
{
if (x0 != 0 && map[x0 - 1][y0] != '#' && map[x0 - 1][y0] != 'X')
return mazeTraverse(map, x0 - 1, y0);
else if (x0 != 11 && map[x0 + 1][y0] != '#' && map[x0 + 1][y0] != 'X')
return mazeTraverse(map, x0 + 1, y0);
else if (y0 != 0 && map[x0][y0 - 1] != '#' && map[x0][y0 - 1] != 'X')
return mazeTraverse(map, x0, y0 - 1);
else
return mazeTraverse(map, x0, y0 + 1);
}
/**
* 递归求解迷宫问题.
*
* \param map 地图数组
* \param x0 点的行数
* \param y0 点的列数
*/
int mazeTraverse(char map[][13], int x0, int y0) //x0行y0列
{
static int step = 0;
map[x0][y0] = 'X';
printMap(map);
if ((x0 == 0 || x0 == 11 || y0 == 0 || y0 == 11) && step) //若走到边界且步数不为0,走出迷宫,返回1
return 1;
if (step == 0) { //如果是第一步
step++;
return move(map, x0, y0);
}
else
{
step++;
//核心代码,可能有点难理解
//当当前位置只有一个方向可以走时,毋庸置疑直接走就行了,当有多个方向
//可以走的时候就从某个方向开始试这条路是否为通路,move函数返回的是这
//条路是否为通,当这条路为通的时候我们直接返回1代表此路为通,当这条路
//非通时就测试别的方向并返回。?:是一个三元运算符,a?b:c表示如果a非0,
//返回b,否则返回c,这里就是如果move为1,返回1,否则再move一次试试。
switch (check(map, x0, y0)) //判断有几个可走点
{
case 0:
return 0;
case 1:
return move(map, x0, y0);
case 2:
return move(map, x0, y0) ? 1 : move(map, x0, y0);
case 3:
return move(map, x0, y0) ? 1 : move(map, x0, y0) ? 1 : move(map, x0, y0);
}
}
}
int main(int argc, char* argv[])
{
mazeTraverse(MAP, 2, 0);
return 0;
}