普通寻路算法

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值