简单回溯算法跑迷宫C实现

简单回溯算法跑迷宫C实现

通过C语言的函数递归来实现回溯算法的算法思想

完整代码如

#include "stdio.h"
char map[10][20];		//测试数组
int x;    //路径助记符
int main() {
	//测试用例初始化
	void Map();
	Map();
	//寻路
	char FindRoute(int, int);
	printf("%c", FindRoute(0, 0));
	//printf("%c", map[10][5]);
	//显示寻路路径
	int i, j;
	for (i = 0; i <= 9; i++) {
		for (j = 0; j <= 19; j++) {
			printf("%c",map[i][j]);
		}
		printf("\n");
	}
	return 0;
}
//生成测试数组
void  Map() {
	//循环控制变量访问测试数组元素
	int i, j;
	//第一段
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 20; j++) {
			map[i][j] = '@';
		}
	}
	//第二段
	map[0][0] = '2', map[0][1] = ' ', map[0][2] = ' ', map[1][2] = ' ', map[1][3] = ' ', map[2][3] = ' ';
	map[2][4] = ' ', map[3][4] = ' ', map[3][5] = ' ', map[3][6] = ' ', map[4][6] = ' ', map[4][7] = ' ';
	map[4][8] = ' ', map[5][8] = ' ', map[5][9] = ' ', map[5][10] = ' ', map[6][10] = ' ', map[6][11] = ' ';
	map[6][12] = ' ', map[7][12] = ' ', map[7][13] = ' ', map[7][14] = ' ', map[6][14] = ' ', map[5][14] = ' ';
	map[5][15] = ' ', map[4][15] = ' ', map[5][14] = ' ', map[4][14] = ' ', map[4][13] = ' ', map[4][12] = ' ';
	map[3][12] = ' ', map[3][11] = ' ', map[3][10] = ' ', map[2][10] = ' ', map[2][9] = ' ', map[2][8] = ' ';
	map[1][8] = ' ', map[0][8] = ' ', map[0][9] = ' ', map[0][10] = ' ', map[0][11] = ' ', map[0][12] = ' ';
	map[0][13] = ' ', map[0][14] = ' ', map[0][15] = ' ', map[0][16] = ' ', map[0][17] = ' ', map[0][18] = ' ';
	map[0][19] = ' ', map[1][19] = ' ', map[4][5] = ' ', map[4][4] = ' ', map[4][3] = ' ', map[4][2] = ' ';
	map[5][2] = ' ', map[6][2] = ' ', map[7][2] = ' ', map[7][3] = ' ', map[8][3] = ' ', map[8][4] = ' ';
	map[8][5] = ' ', map[9][5] = ' ', map[9][6] = '1';/* map[][] = ' ', map[][] = ' ', map[][] = ' ';
	map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ';
	map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ';
	map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ';
	map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ';
	map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ', map[][] = ' ';*/
	//显示
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 20; j++) {
			printf("%c", map[i][j]);
		}
		printf("\n");
	}
}
//寻路算法
char FindRoute(int i, int j) {
	//printf("%d\n",++x);
	//
	if ((map[i + 1][j] == '1' || map[i][j + 1] == '1' || map[i - 1][j] == '1' || map[i][j - 1] == '1')) {
		return 'Y';
	}
	//
	if (i >= 0 && j >= 0 && i <= 9 && j <= 19) {
		//向右
		if (map[i + 1][j] == ' ') {
			map[i + 1][j] = 'O';
			printf("横坐标i%d,纵坐标j%d__向右\n", i, j);
			if (FindRoute(i + 1, j) == 'Y') {
				return 'Y';
			}
		}
		//向下
			if (map[i][j + 1] == ' ') {
				map[i][j + 1] = 'O';
				printf("横坐标i%d,纵坐标j%d__向下\n", i, j);
				if (FindRoute(i, j + 1) == 'Y') {
					return 'Y';
				}
			}
		//向左
				if (map[i - 1][j] == ' ') {
					map[i - 1][j] = 'O';
					printf("横坐标i%d,纵坐标j%d__向左\n", i, j);
					if (FindRoute(i - 1, j) == 'Y') {
						return 'Y';
					}
				}
		//向上
					if (map[i][j - 1] == ' ') {
						map[i][j - 1] = 'O';
						printf("横坐标i%d,纵坐标j%d__向上\n", i, j);
						if (FindRoute(i, j - 1) == 'Y') {
							return 'Y';
						}
					}
		//寻路成功

		//寻路失败
		return 'N';
	}
	return 'N';//寻路失败
}

回溯讲解

回溯算法是一种深度优先算法,其算法思想是在求解问题时在当前位置找出一个局部解,再在下一位置找出局部解,最后求出最终解,若局部解无法求出最终解,则返回到上一求出局部解的位置再找出另一个局部解,若找不出局部解或最终解则继续递归返回,当返回到递归开始的位置依旧无法得出最终解,则可以判定为无解,回溯算法的常见应用如象棋中的悔棋操作(递归的一个特征便是现场保护,在问题求解过程中都会保留上一求解过程,当递归返回之后才会释放,这也是回溯算法的特征),和求解迷宫路径。

代码讲解

程序用C语言的二维数组来模拟迷宫地图,用函数Map()来进行初始化, i 为列 j 为行
,二维数组map[][]我定义为全局变量,因为在函数返回时只能返回一维数组形式不能返回为多维数组的形式,处理起来比较麻烦,所以便简单点定义为全局变量。
在编写回溯算法时因为在迷宫中行走方向只有上下左右四个方向,所以,在设置递归时便创建了上下左右四个递归的方向,

写在后面

若文中有错误或不妥之处欢迎指出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值