西南科技大学 大一数据结构大作业 西南科技大学地图导航系统

#include<iostream>
#define max 100 
#define infinity 10000
using namespace std;
void welcome();//开始界面 
void menu();//主菜单 
void message();//作者信息介绍 
void mainplace();//地图地点列表 
void map();//校园地图 
void introduce();//主要地点简介 
void position1();//地点之间的距离 
void dijkstra(int v0,int s);//最短路径 
void menuchange();//菜单逻辑 

void welcome()
{
    cout<<" ________________________________"<<endl;
    cout<<"|    [西南科技大学导航系统]      |"<<endl;
    cout<<"|                                |"<<endl;
    cout<<"| *欢迎使用西南科技大学导航系统* |"<<endl;
    cout<<"|________________________________|"<<endl;
    system("pause");
    system("cls");
}
void menu()
{
    system("cls");
    cout<<" ________________________________"<<endl;
    cout<<"|     [西南科技大学导航系统]     |"<<endl;
    cout<<"|          [系统主菜单]          |"<<endl;
    cout<<"|         1.校园导航地图         |"<<endl;
    cout<<"|         2.校园主要地点         |"<<endl;
    cout<<"|         3.主要地点简介         |"<<endl;
    cout<<"|         4.进入导航系统         |"<<endl;
    cout<<"|         5.退出导航系统         |"<<endl;
    cout<<"|         6.查看作者信息         |"<<endl;
    cout<<"|________________________________|"<<endl;
}

void menuchange() 
{
    int n;
    while(1)
    {
        int v0=0,s=0;
        menu(); 
        cout<<"请输入您想要进行的操作:";
        cin>>n;
        switch(n)
        {
            case 1:
                {
                    system("cls");
                    map();
                    cout<<"返回"; 
                    system("pause");
                }break;
            case 2:
                {
                    system("cls");
                    mainplace();
                    cout<<"返回";
                    system("pause");
                }break;
            case 3:
            {
                system("cls");
                introduce();
                cout<<"返回"; 
                system("pause");
            }break;
            case 4:
                {
                    system("cls");
                    mainplace();
                    while(v0<1||v0>10)
                    {
                        cout<<"请输入您的起点:";
                        cin>>v0;
                        if(v0<1||v0>10)
                        {
                        cout<<"输入有误!请重新输入。"<<endl;
                        }
                    } 
                    while(s<1||s>10)
                    {
                        cout<<"请输入您的终点:";
                        cin>>s;
                        if(s<1||s>10)
                        {
                        cout<<"输入有误!请重新输入。"<<endl;
                        }
                    }
                    system("cls");
                    map();
                    dijkstra(v0,s);
                    cout<<"返回主菜单"; 
                    system("pause"); 
                }break;
            case 5:
            {
                system("cls");
                cout<<"感谢您的使用!"; 
                exit(-1); 
                system("pause");
            }break;
            case 6:
                {
                    system("cls");
                    message();
                    cout<<"返回";
                    system("pause"); 
                }break;
            default:
                {
                    cout<<"输入不符合要求,请重新输入"<<endl;
                    system("pause");
                } 
        }
    }
}
void message()
{
    system("cls");
    cout<<" ________________________________"<<endl;
    cout<<"|    [西南科技大学导航系统]      |"<<endl;
    cout<<"|          [作者信息]            |"<<endl;
    cout<<"|         作者:吴炫逸           |"<<endl;
    cout<<"|       学号:5120220210         |"<<endl;
    cout<<"|     专业班级:计算机2209       |"<<endl;
    cout<<"|________________________________|"<<endl;
}
void mainplace()
{
    cout<<" ________________________________________________"<<endl;
    cout<<"|                  [校园主要地点]                | "<<endl;
    cout<<"|                                                |"<<endl;
    cout<<"|   (1)西二门     (2)后花园       (3)逸夫图书馆  |"<<endl;
    cout<<"|   (4)北三宿舍楼 (5)科大苑食堂   (6)校友林      |"<<endl;
    cout<<"|   (7)中心湖     (8)科技之光广场 (9)新区体育场  |"<<endl;
    cout<<"|   (10)107广场                                  |"<<endl;
    cout<<"|________________________________________________|"<<endl;
}
void map()
{
    cout<<"   西南科技大学                 __________________"<<endl;
    cout<<"     校园地图:                |                  |_______________________"<<endl;
    cout<<"                               |     。_________________________          |__ "<<endl;
    cout<<" ______________________________|     |校友林                    |            |"<<endl;
    cout<<"|     西二门                         |                          |            |___"<<endl;
    cout<<"|   。_________________。____________|__                        |                |"<<endl;
    cout<<"|   |                  | 逸夫图书馆     |                       |                |"<<endl;
    cout<<"|   |                  |                |                       |                |"<<endl;
    cout<<"|   |                  |________________。中心湖                |                |"<<endl;
    cout<<"|   |                              |    |                       |                |"<<endl;
    cout<<"|   |            北三宿舍楼        |    |__                     |                |"<<endl;
    cout<<"|   |__________。__________________|    |  |____________________|                |"<<endl;
    cout<<"|   |          |                        |                       |                |"<<endl;
    cout<<"|   |          |___                     |             __________。新区体育场     |"<<endl;
    cout<<"|   |              |        ____________|            |                           |"<<endl;
    cout<<"|   |__。后花园    |       |                         |                           |"<<endl;
    cout<<"|      |           |       | 科技之光广场            |                           |"<<endl;
    cout<<"|      |           |       。__________________      |                           |"<<endl;
    cout<<"|      |           |       |                   |_____。107广场                   |"<<endl;
    cout<<"|      |           |       |                                                     |"<<endl;
    cout<<"|      |___________。______|                                                     |"<<endl;
    cout<<"|                    科大苑食堂                                        __________|"<<endl;
    cout<<"|_____________________________________________________________________|"<<endl;
}
void introduce()
{
    while(1)
    {
        system("cls");
        cout<<" _____________________________________"<<endl;
        cout<<"|   (1)中心湖       (2)逸夫图书馆     |"<<endl;
        cout<<"|   (3)107广场      (4)科技之光广场   |"<<endl;
        cout<<"|   (5)后花园       (6)校友林         |"<<endl;
        cout<<"|                                     |"<<endl;
        cout<<"|        输入7 可返回主菜单           |"<<endl;
        cout<<"|_____________________________________|"<<endl;
        int n;
        cout<<"请输入您想要查询的地点编号:";
        cin>>n;
        switch(n)
        {
        case 1:
            {
                system("cls");
                cout<<"中心湖:"<<endl;
                cout<<"中心湖又名四海湖,面积不小的一个湖,周围环绕着柳树,湖中央一个小岛,更显神秘,情侣最佳浪漫中心。"<<endl;
                cout<<"返回地点列表"; 
                system("pause");
            }break;
        case 2:
            {
                system("cls");
                cout<<"逸夫图书馆:"<<endl;
                cout<<"西南科技大学图书馆始建于1952年,至今已有60余年历史。60多年的丰厚沉淀,使图书馆建成了集学习、教学、研究、服务于一体的现代化大学图书馆。"<<endl;
                cout<<"返回地点列表"; 
                system("pause"); 
            }break;
        case 3:
            {
                system("cls");
                cout<<"107广场:"<<endl;
                cout<<"107广场位于西七教学楼中心,常用于组织社团招新活动以及公益互动。"<<endl;
                cout<<"返回地点列表"; 
                system("pause");
            }break;
        case 4:
            {
                system("cls");
                cout<<"科技之光广场:"<<endl;
                cout<<"西南科技大学科技之光广场是本校的地标性建筑之一其雕塑上由0和1的计算机语言、钉子以及齿轮组成,象征计算机学院与制造学院的光辉历程。"<<endl;
                cout<<"返回地点列表"; 
                system("pause");
            }break;
        case 5:
            {
                system("cls");
                cout<<"后花园:"<<endl;
                cout<<"西南科技大学后花园位于学校后山,花园里有美丽的景色以及环境优雅的餐厅。"<<endl;
                cout<<"返回地点列表"; 
                system("pause");
            }break;
        case 6:
            {
                system("cls");
                cout<<"校友林:"<<endl;
                cout<<"校友林位于新区体育场旁边,其中有全国各地校友会的校友石,平日里可以坐在校友林的长椅上修养身心。"<<endl;
                cout<<"返回地点列表"; 
                system("pause");
            }break;
        case 7:
            {
                system("cls");
                menuchange();
                system("pause");
            }break;
        default:
            {
                cout<<"输入不符合要求,请重新输入"<<endl;
                system("pause");
            }
        }
     }
}
int position[max][max];
char name[max][max]={"","西二门","后花园","逸夫图书馆","北三宿舍楼","科大苑食堂","校友林","中心湖","科技之光广场","新区体育场","107广场"}; 
void position1()
{
    int i,j;
    for(i=1;i<=10;i++)
    {
        for(j=1;j<=10;j++)
        {
            if(i==j)
            {
                position[i][j]=0;//同一个点之间的距离为 0 
            }
            else position[i][j]=infinity;//初始时两点间的距离都设置成无穷大 
        }
    }
    position[1][2]=500;position[1][3]=500;position[1][4]=450;
    position[2][5]=300;
    position[3][6]=300;position[3][7]=100;
    position[4][5]=300;position[4][7]=600;
    position[5][8]=700;
    position[6][7]=250;position[6][9]=800;
    position[7][8]=600;position[7][9]=850;
    position[8][10]=550;
    position[9][10]=300;
    for(i=1;i<=10;i++)
    {
        for(j=1;j<=10;j++)
        {
            position[j][i]=position[i][j];//将图变为无向图 
        }
    }
}

void dijkstra(int v0,int s) 
{
    int i,j,k,v,min;
    int path[max],distance[max];//distance:最优路径集合 path:当前节点所连接的之前的节点集 
    int flag[max],dis[max]; //flag:标记数组 dis:距离长度集合
    
    //初始化
    for(i=1;i<=10;i++)//将标记数组全部初始化为 0
    {
        flag[i]=0;
     } 
    for(i=1;i<=10;i++)
    {
        dis[i]=position[v0][i];//将距离集合赋值为与出发点连接的边的权值
        if(dis[i]<infinity)//当距离小于无穷大,则说明初始点与某节点间有路径
        {
            path[i]=v0;//将所有结点之前的结点设为 v0
        }
    }
    flag[v0]=1;//此时出发点已经调用完毕,将标记数组中 v0位置的数值由 0变为 1
    
    //求最短路径的步骤 1:每次在未标记的节点中选择与出发点相连的结点,将新找到的结点进行标记以及收录
    for(i=1;i<10;i++)
    {
        min=infinity;
        for(j=1;j<=10;j++)
        {
            if(flag[j]==0&&dis[j]<min)//在尚未成为最优结点的结点集中找距离不是无穷大的 
            {
                min=dis[j];//将无穷大值赋值为两节点间的距离 
                k=j;//定义一个整形,存放所遍历过得结点 
            }
        }
        flag[k]=1;//将已经遍历过得结点的标记数值赋值为 1
        
    /*求最短路径的步骤 2:计算刚加入的结点与不含标记的结点之间的距离,
    如果两结点的距离之和小于不含标记的结点的自身距离,则对不含标记的结
    点进行距离更新 */
        for(v=1;v<=10;v++)
        {
            if(flag[v]==0&&dis[v]>dis[k]+position[k][v])
            {
                path[v]=k;
                dis[v]=dis[k]+position[k][v];
            }
        }
    }
    v=s;
    i=1;
    while(path[v]!=v0)
    {
        distance[i++]=path[v];
        v=path[v];
     }
     k=i-1;//寻找前一个点
     cout<<"最短路线为:";
     cout<<name[v0]<<"-->";//初始位置的名称
     for(i=k;i>=1;i--)
     {
         cout<<name[distance[i]]<<"-->";//结点名称从后到前依次输出
      } 
      cout<<name[s]<<endl;//最后输出目的地名称
      cout<<"全程"<<dis[s]<<"米"<<endl;
}
int main()
{
    position1();
    welcome();
    menu();
    menuchange();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值