#include<stdio.h>
/* 普通寻路算法
回溯法,近似穷举
找到的路径不一定是最短路径
*/
#define MAX_NUMBER_LENGTH 6
void print_path();
/*用矩阵表示地图:其中1表示路,0表示没有路,2表示终点,起始地点为(1,0)*/
static int gPath[MAX_NUMBER_LENGTH][MAX_NUMBER_LENGTH] =
{
{0, 0, 0, 0, 1, 1},
{1, 1, 0, 0, 1, 0},
{0, 1, 1, 1, 1, 0},
{0, 0, 1, 0, 1, 2},
{0, 0, 1, 1, 1, 1},
{0, 0, 1, 1, 1, 0}
};
static int gValue[MAX_NUMBER_LENGTH][MAX_NUMBER_LENGTH] = {0}; /* 记录已走过的路 */
/*判断函数,判断当前节点是否合法*/
int check_pos_valid(int x, int y)
{
/* 节点是否出边界 */
if(x < 0 || x>= MAX_NUMBER_LENGTH || y < 0 || y >= MAX_NUMBER_LENGTH)
return 0;
/* 当前节点是否存在路 */
if(0 == gPath[x][y])
return 0;
/* 当前节点是否已经走过 */
if('#' == gValue[x][y])
return 0;
return 1;
}
/*递归的寻找算法*/
int find_path(int x, int y)
{
if(check_pos_valid(x,y))
{
if(2 == gPath[x][y])
{
gValue[x][y] = '#';
return 1;
}
gValue[x][y] = '#';
if(find_path(x, y-1))
return 1;
if(find_path(x-1, y))
return 1;
if(find_path(x, y+1))
return 1;
if(find_path(x+1, y))
return 1;
//走到头,没有路可以走
gValue[x][y] = 0;
return 0;
}
return 0;
}
/*寻找所有路径*/
void find_path_all(int x, int y)
{
if(check_pos_valid(x,y))
{
if(2 == gPath[x][y]){
gValue[x][y] = '#';
print_path();
gValue[x][y] = 0;
}
gValue[x][y] = '#';
find_path(x, y-1);
find_path(x-1, y);
find_path(x, y+1);
find_path(x+1, y);
gValue[x][y] = 0;
}
}
/*打印路径*/
void print_path()
{
int outer;
int inner;
for(outer = 0; outer < MAX_NUMBER_LENGTH; outer++){
for(inner = 0; inner < MAX_NUMBER_LENGTH; inner++){
printf("%c ", gValue[outer][inner]);
}
printf("\n");
}
}
int main()
{
find_path(1,0);
print_path();
return 0;
}
普通寻路算法
最新推荐文章于 2024-09-08 15:12:17 发布