寻路算法实现

实现任意两点间的寻路,自动选择最优或较优路径
1.基本要求
可以以矩阵表示地图,
{1,1,1,1,1,1,1,1,1,1,1 }
{1,0,1,0,1,0,0,0,0,0,1 }
{1,0,1,0,0,0,1,0,1,1,1 }
{1,0,0,0,1,0,1,0,0,0,1 }
{1,0,1,1,0,0,1,0,0,1,1 }           0代表可以通过,1代表不可通过
{1,0,1,0,1,1,0,1,0,0,1 }
{1,0,0,0,0,0,0,0,1,0,1 }
{1,0,1,0,1,0,1,0,1,0,1 }
{1,0,0,1,0,0,1,0,1,0,1 }
{1,1,1,1,1,1,1,1,1,1,1 }
可以任意设定起点和终点,可以任意设定地图,输出路径和步数。
2.项目扩展
在实现基本要求的情况下,进一步完善程序
可以加入移动力、地形以及移动在不同地形上的损耗等因素
可以用图形化界面取代字符界面


用Dijkstra算法,我做的给你个参考,下面各点是有距离的(移动力),BIG表示不可通过

#define BIG 32767 //无穷大 
int pre[6]={0}; //这是关键!pre数组用于记录每个点的前趋,这样算出最短路径后,就可以递归出路径经过的点 
int Distance[6]; //用于记录从起点到达每个点的最短路径长度 
int Cost[6][6]={{0,1450,1650,BIG,BIG,BIG}, //有向网的邻接矩阵,这里以6个点为例 
        {1450,0,BIG,1350,2350,BIG}, 
        {1650,BIG,0,BIG,2550,BIG}, 
        {BIG,1350,BIG,0,BIG,1200}, 
        {BIG,2350,2550,BIG,0,850}, 
        {BIG,BIG,BIG,1200,850,0}, 
        };

//Dijkstra算法函数,求给定点到其余各点的最短路径 
//参数:邻接矩阵、顶点数、出发点的下标、结果数组、每个点的前趋 
void Dijkstra(int Cost[][6],int n,int v0,int Distance[],int pre[]) 

  int s[6]; 
  int mindis,dis; 
  int i,j,u; 
  //初始化 
  for(i=0;i<n;i++) { 
    Distance[i]=Cost[v0][i]; 
    s[i]=0; 
  } 
  s[v0] =1; //标记v0 
  //在当前还未找到最短路径的顶点中,寻找具有最短距离的顶点 
  for(i=0;i<n;i++){ 
    if(Distance[i]<BIG) pre[i]=v0; 
  } 
  for(i=1;i<n;i++) { //每循环一次,求得一个最短路径 
    mindis=BIG; 
    for (j=0;j<n;j++) //求离出发点最近的顶点 
      if(s[j]==0&&Distance[j]<mindis) { 
        mindis=Distance [j]; 
        u=j; 
      } 
    for(j=0;j<n;j++) //修改递增路径序列(集合) 
      if(s[j]==0) { //对还未求得最短路径的顶点 
        //求出由最近的顶点 直达各顶点的距离 
        dis=Distance[u] +Cost[u][j]; 
        //如果新的路径更短,就替换掉原路径 
        if(Distance[j]>dis){ 
          Distance[j]=dis; 
          pre[j]=u; 
        } 
      } 
    s[u]=1; // 标记最短路径已经求得 
  } 
}

用Dijkstra函数算出最短路径后,就可以递归出从给定顶点到各点的最短路径上的每个点了,函数如下(不含终点):

char pathres[100]=""; //保存路径 
char *Vertex[6]={"福州","上海","广州","北京","成都","西安"}; 
//参数:起点、终点 
void shpath(int st,int ed) //起点应该为Dijkstra函数中的v0 

  if(pre[ed]!=st){ 
    shpath(st,pre[ed]); 
  } 
  strcat(pathres,Vertex[pre[ed]]); 
  strcat(pathres,"-"); 
} //最后要在主函数中把终点加到pathres里

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值