C++基于Floyd算法实现校园导航系统

本文实例为大家分享了C++基于Floyd算法实现校园导航系统的具体代码,供大家参考,具体内容如下

首先是配置文件

//文件名'MGraph.h'
//用途:创建邻接矩阵
#include<iostream>
#include<stdlib.h>
using namespace std;
/*
*author:xcy 
*date:2019.6.1 
*/
#define MaxInt 32767 //表示极大值
#define MaxNum 100  //表示最大顶点数
typedef int status;
typedef string VerTexType;  //顶点的数据类型
typedef int ArcType;  //边的权值为整型
typedef struct
{
    VerTexType vexs[MaxNum];   //顶点表
    ArcType arcs[MaxNum][MaxNum];   //邻接矩阵
    int vexnum,arcnum;//当前的点和边数
    char name[MaxNum];
}AMGraph;

status CreateMap(AMGraph &G)//地图的创建 
{
    G.vexnum=10; 
    G.arcnum=13;
    G.vexs[0]="北门";
    G.vexs[1]="下沉广场";
    G.vexs[2]="青年公寓";
    G.vexs[3]="齐贤广场";
    G.vexs[4]="15教";
    G.vexs[5]="菜鸟驿站";
    G.vexs[6]="汇森楼";
    G.vexs[7]="图书馆";
    G.vexs[8]="体育馆";
    G.vexs[9]="南苑餐厅";
    
    for(int i=0;i<MaxNum;i++)//初始化所有顶点之间距离 
    {
        for(int j=0;j<MaxNum;j++)
        {
            G.arcs[i][j] = MaxInt;
        }
    }
    //各顶点之间距离
    G.arcs[0][1] = G.arcs[1][0] = 300;    
    G.arcs[0][2] = G.arcs[2][0] = 600;    
    G.arcs[1][2] = G.arcs[2][1] = 200;    
    G.arcs[2][3] = G.arcs[3][2] = 600;    
    G.arcs[2][6] = G.arcs[6][2] = 1000;
    G.arcs[3][4] = G.arcs[4][3] = 100;    
    G.arcs[3][6] = G.arcs[6][3] = 800;    
    G.arcs[4][5] = G.arcs[5][4] = 100;    
    G.arcs[4][8] = G.arcs[8][4] = 400;
    G.arcs[5][9] = G.arcs[9][5] = 700;
    G.arcs[6][7] = G.arcs[7][6] = 100;
    G.arcs[7][8] = G.arcs[8][7] = 100;
    G.arcs[8][9] = G.arcs[9][8] = 300;
}

具体方法实现

#include<iostream>
#include<stdlib.h>
#include"MGraph.h" 
using namespace std;
/*
*author:xcy 
*date:2019.6.12
*change:使用弗洛依德算法 
*/

int shortPath[MaxNum][MaxNum];//最短路径长度 
int Path[MaxNum][MaxNum];//保存下一个节点 
void ShortestPath_Floyd(AMGraph G)//弗洛依德算法
{
    int i,j,k;
    for(i=0;i<G.vexnum;i++)//循环遍历所有顶点(横列) 
    {
        for(j=0;j<G.vexnum;j++)//循环遍历所有顶点(竖列)
        {
            shortPath[i][j]=G.arcs[i][j];//保存权值 
            if(shortPath[i][j]<MaxInt&&i!=j) 
                Path[i][j]=j;//保存下一个顶点下标 
            else Path[i][j]=-1;
        }
    }
    //算法核心语句 
    for(k=0;k<G.vexnum;k++)//遍历所有点(作为中点) 
    {
        for(i=0;i<G.vexnum;i++)//遍历行 
        {
            for(j=0;j<G.vexnum;j++)//遍历列 
            {
                //松弛操作 如果经历k点距离小于两点之间距离,选择经过k点的路线 
                if(shortPath[i][k]+shortPath[k][j]<shortPath[i][j])
                {
                    shortPath[i][j]=shortPath[i][k]+shortPath[k][j];
                    Path[i][j]=Path[i][k];//更新操作 
                }
            }
        }
    }
}

void math()//次级界面
{
    int a,b,i,j,k,m,n;
    AMGraph G;
    CreateMap(G);
    ShortestPath_Floyd(G);    //弗洛依德算法
    cout<<"1.北门 2.下沉广场 3.青年公寓 4.齐贤广场 5.15教"<<endl;
    cout<<"6.菜鸟驿站 7.汇森楼 8.图书馆 9.体育馆 10.南苑餐厅"<<endl;
    cout<<"输入起点的序号"<<endl;
    cin>>a;
    cout<<"输入终点的序号"<<endl;
    cin>>b;
    m=a-1;
    n=b-1;
    cout<<"最短路径:"<<shortPath[m][n]<<"米"<<endl;
    cout<<"路径为:"<<G.vexs[m];
    k=Path[m][n];
    while(k!=n)
    {
        cout<<" -> "<<G.vexs[k];
        k=Path[k][n];
    }
   cout<<" -> "<<G.vexs[n]<<endl;

}
void scence()//显示地图 
{
    cout<<"\t\t--------------------------------------------------------"<<endl;
    cout<<"\t\t|       北门                                           |"<<endl; 
    cout<<"\t\t|                                                      |"<<endl;
    cout<<"\t\t|  下沉                                                |"<<endl;
    cout<<"\t\t|  广场           青年                                 |"<<endl;
    cout<<"\t\t|                 公寓                                 |"<<endl;
    cout<<"\t\t|                                                      |"<<endl;
    cout<<"\t\t|                                   菜鸟               |"<<endl;
    cout<<"\t\t|                          15教     驿站               |"<<endl;
    cout<<"\t\t|                                                      |"<<endl;
    cout<<"\t\t|                    齐贤广场                          |"<<endl;
    cout<<"\t\t|                                               南苑   |"<<endl;
    cout<<"\t\t|                                               餐厅   |"<<endl;
    cout<<"\t\t|               汇森楼                                 |"<<endl;
    cout<<"\t\t|                         图书馆    体育馆             |"<<endl;
    cout<<"\t\t--------------------------------------------------------"<<endl;
}

void Gui()//主界面
{
    char a;
    cout<<"\t\t\t┌--------------------------------┐"<<endl;
    cout<<"\t\t\t│                                │"<<endl;
    cout<<"\t\t\t│   欢迎使用南工校园导航系统     │"<<endl;
    cout<<"\t\t\t│                                │"<<endl;
    cout<<"\t\t\t│--------------------------------│"<<endl;
    cout<<"\t\t\t│      1. 查看校园全貌           │"<<endl;
    cout<<"\t\t\t│      2. 计算最短路径           │"<<endl;
    cout<<"\t\t\t│      3. 退出导航系统           │"<<endl;
    cout<<"\t\t\t└--------------------------------┘"<<endl;
    while(true){
    cout<<"\t\t\t输入要操作的序号(1-3):";
        cin>>a;
        (int)a;
        if(a>'0'&&a<='3')
            switch(a)
            {
                  case '1': scence(); break;
                  case '2': math(); break;
                  case '3': cout<<"\t\t\t感谢您的使用!";exit(0);break;
              }
          else cout<<"\t\t\t请输入1-3!!"<<endl; 
    }   
}

int main()
{
    Gui();
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现导航功能

    本文实例为大家分享了C语言实现导航功能的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<string.h> #define NUM 25 #define INFINITY 32767 #define False 0 #define True 1 typedef struct {     int number;//顶点的编号      const char *sight;//顶点的信息   } VertexType;//顶点的类型     t

  • C++基于Floyd算法实现校园导航系统

    本文实例为大家分享了C++基于Floyd算法实现校园导航系统的具体代码,供大家参考,具体内容如下 首先是配置文件 //文件名'MGraph.h' //用途:创建邻接矩阵 #include<iostream> #include<stdlib.h> using namespace std; /* *author:xcy  *date:2019.6.1  */ #define MaxInt 32767 //表示极大值 #define MaxNum 100  //表示最大顶点数 typed

  • Python基于Floyd算法求解最短路径距离问题实例详解

    本文实例讲述了Python基于Floyd算法求解最短路径距离问题.分享给大家供大家参考,具体如下: Floyd算法和Dijkstra算法,相信大家都不陌生,在最短路径距离的求解中应该算得上是最为基础和经典的两个算法了,今天就用一点时间来重新实现一下,因为本科的时候学习数据结构才开始接触的这个算法,当时唯一会用的就是C语言了,现在的话,C语言几乎已经离我远去了,个人感觉入手机器学习以来python更得我心,因为太通俗易懂了,带给你的体验自然也是非常不错的. 当然网上 有很多的算法讲解教程,我不会在

  • Java基于Dijkstra算法实现校园导游程序

    本文实例为大家分享了Dijkstra算法实现校园导游程序的具体代码,供大家参考,具体内容如下 应用设计性实验 1.问题描述 校网导游程序: 一个校园有若干景点,如正校门.人工湖.磁悬浮列车实验室.樱花大道.图书馆.体育场体育馆和礼堂等.实现一个为来访客 人提供信息在询服务的程序,如查询景点的详细信息,查询两个景点之间的一条最短路径. 2.实验要求 (1)设计你所在学校的校园平面图,所含景点不少于10个.(2)来访客人可以输人任一个景点的名称,查询景点的详细信息.(3)来访客人可以输人任何两个景点

  • Java实现的具有GUI的校园导航系统的完整代码

    0.写在前面 2020-5-18更新 这个东西已经是两年前的了,现在问我具体细节我也不是很清楚了,而且现在review两年前的代码感觉写的好烂...请大家有问题下面留言,不要加我的企鹅了,正在准备考研,比较忙. 一点建议: 1.当时会的比较少,对象实例化对于单纯的数据查询来说效率极低而且很蠢,我现在更建议使用数据库,或者简单点用xmlorjson都可以,建议想写的好一点的同学把里面的数据读写逻辑改一改,用数据库不香吗 2.这个是分客户端服务端的,服务端相当于用底层手撸了一个相当简单的tomcat

  • PHP基于回溯算法解决n皇后问题的方法示例

    本文实例讲述了PHP基于回溯算法解决n皇后问题的方法.分享给大家供大家参考,具体如下: 这里对于n皇后问题就不做太多的介绍,相关的介绍与算法分析可参考前面一篇C++基于回溯法解决八皇后问题. 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法.这种方法适用于解一些组合数相当大的问题. 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向

  • 判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS代码: /** * 银行卡格式校验 * * @param cardNo 银行卡号 * * @return */ + (BOOL) checkCardNo:(NSString*) cardNo{ int oddsum = 0; //奇数求和 int evensum = 0; //偶数求和 int al

  • Python基于分水岭算法解决走迷宫游戏示例

    本文实例讲述了Python基于分水岭算法解决走迷宫游戏.分享给大家供大家参考,具体如下: #Solving maze with morphological transformation """ usage:Solving maze with morphological transformation needed module:cv2/numpy/sys ref: 1.http://www.mazegenerator.net/ 2.http://blog.leanote.com

  • Python基于DES算法加密解密实例

    本文实例讲述了Python基于DES算法加密解密实现方法.分享给大家供大家参考.具体实现方法如下: #coding=utf-8 from functools import partial import base64 class DES(object): """ DES加密算法 interface: input_key(s, base=10), encode(s), decode(s) """ __ip = [ 58,50,42,34,26,18,

  • C++实现多源最短路径之Floyd算法示例

    本文实例讲述了C++实现多源最短路径之Floyd算法.分享给大家供大家参考,具体如下: #include<cstdio> #include<cstring> #include<iostream> #define MAX 999 using namespace std; int n,m; int e[MAX][MAX]; void Init() { for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) { if(i==

  • Nodejs基于LRU算法实现的缓存处理操作示例

    本文实例讲述了Nodejs基于LRU算法实现的缓存处理操作.分享给大家供大家参考,具体如下: LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了.由于无法预测各页面将来的使用情况,只能利用"最近的过去"作为"最近的将来"的近似,因此,LRU算法就是将最近最久未使用的页面予以淘汰. 可以用一个特殊的栈来保存当前正在使用的各个页面的页面号.当一个新的进程访问某页面时,便将

随机推荐