简单回溯算法跑迷宫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[][]我定义为全局变量,因为在函数返回时只能返回一维数组形式不能返回为多维数组的形式,处理起来比较麻烦,所以便简单点定义为全局变量。
在编写回溯算法时因为在迷宫中行走方向只有上下左右四个方向,所以,在设置递归时便创建了上下左右四个递归的方向,
写在后面
若文中有错误或不妥之处欢迎指出。