迷宫问题——C语言纯数组递归求解

本文介绍了一种简单的迷宫求解算法实现,通过递归方式遍历迷宫路径,最终找到出口。该算法避免使用复杂的数据结构和高级算法,易于理解和实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近碰到一个需求,要求解一个迷宫问题,还不能用各种乱七八糟的数据结构以及复杂点的算法,没办法只好慢慢写了一下。随便写的,估计挺多不足,放出来备忘一下,说不定对谁有用呢。

#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值