数据结构课程设计(四):校园导游程序

问题描述:用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够回答有关景点介绍、游览路径等问题。
基本要求:查询各景点的相关信息;查询图中任意两个景点间的最短路径;查询图中任意两个景点间的所有路径;增加、删除、更新有关景点和道路的信息。
操作:给景点之间的路径赋最大值;最短路径的C语言函数;输出最短路径和最短距离函数;输入景点代码查景点名称和简介;输入景点代码查到其它景点的最短距离。

#include <bits/stdc++.h>

using namespace std;

#define MaxInt 32767
#define MVNum 100

typedef struct message
{
    int num;          //景点代码
    char name[100];    //景点名称
    char pro[500];      //简介
} Ciceroni;

typedef Ciceroni VerTexType;
typedef int ArcType;
typedef struct
{
    VerTexType vexs[MVNum];
    ArcType arcs[MVNum][MVNum];
    int vexnum,arcnum;
} AMGraph;

Ciceroni  school[20]= {{1,"第9寝室楼","5:30-22:30"},{2,"食堂","5:30-11:00"},{3,"文法楼","5:00-23:00,一楼可补办学生卡"},
    {4,"篮球场","全天开放"},{5,"丹青楼","5:00-23:00"},{6,"行政楼","5:00到11:00"},{7,"图书馆","6:00-21:45,星期三下午12:00-18:00阅览室闭馆"},
    {8,"锦绣楼","5:00-23:00"},{9,"理化楼","5:00-23:00"},{10,"林学楼","5:00-23:00"}
};

void CreatMap(AMGraph &G)
{
    int i,j;
    G.vexnum=10;
    G.arcnum=12;
    for(i=0; i<G.vexnum; i++)
        for(j=0; j<G.vexnum; j++)
            G.arcs[i][j]=MaxInt;
    //已知路线长度
    G.arcs[0][1]=150;
    G.arcs[0][2]=100;
    G.arcs[1][9]=200;
    G.arcs[2][3]=200;
    G.arcs[2][9]=300;
    G.arcs[2][4]=300;
    G.arcs[3][6]=200;
    G.arcs[4][5]=100;
    G.arcs[4][7]=50;
    G.arcs[5][6]=100;
    G.arcs[7][8]=50;
    G.arcs[8][9]=100;

    for(i=0; i<10; i++)
        G.vexs[i]=school[i];
    for(i=0; i<G.vexnum; i++)
        for(j=0; j<G.vexnum; j++)
            G.arcs[j][i]=G.arcs[i][j];
}
void PrintMap()
{
    cout<<"\n";
    cout<<"                【学校地图】\n";
    cout<<"食堂(2)--------9号宿舍楼(1)                      \n";
    cout<<" |                 |                             \n";
    cout<<"林学楼(10)------文法楼(3)------------ 篮球场(4) \n";
    cout<<" |                  |                     |      \n";
    cout<<"理化楼(9)-锦绣楼(8)-丹青楼(5)-行政楼(6)-图书馆(7)\n\n";
}

void PrintPlace(AMGraph G,int num)
{
    cout<<"【景点编码】:"<<G.vexs[num-1].num<<"\n【景点名称】:"<<G.vexs[num-1].name<<"\n【景点简介】:"<<G.vexs[num-1].pro<<endl;
}

void SeePlace(AMGraph G)
{
    for(int i=0; i<G.vexnum; i++)
        PrintPlace(G,i+1);
}
void DFS_AM(AMGraph G,int v,int visited[])
{
    PrintPlace(G,v+1);
    visited[v]=1;
    for(int w=0; w<G.vexnum; w++)
        if((G.arcs[v][w]!=0)&&(!visited[w]))
            DFS_AM(G,w,visited);
}
void Menu()
{
    cout<<"┍---------------------------------------┑\n";
    cout<<"             【校园导游程序】\n";
    cout<<"【1】--查看学校平面图\n";
    cout<<"【2】--求两景点之间的最短路径\n";
    cout<<"【3】--增加新的景点\n";
    cout<<"【4】--删除指定路线\n";
    cout<<"【5】--查看指定景点信息\n";
    cout<<"【6】--更改景点相关信息\n";
    cout<<"【7】--查看所有现有景点\n";
    cout<<"【0】--退出程序\n";
    cout<<"┕----------------------------------------┙\n";
    cout<<"请输入指令(1-6):";
}

int CheckNum(int num,AMGraph G)
{
    for(int i=0; i<G.vexnum; i++)
        if(G.vexs[i].num==num)
            return 1;
    return 0;
}

void Change(AMGraph &G,int v,int n,int visited[])
{
    if(n==v)
    {
        cout<<"请输入新的景点名称:";
        cin>>G.vexs[n].name;
        cout<<">景点名称更改为:"<<G.vexs[n].name<<endl;
        cout<<"请输入新的景点简介:";
        cin>>G.vexs[n].pro;
        cout<<">景点简介更改为:"<<G.vexs[n].pro<<endl;
        cout<<"景点信息更改完成."<<endl;
    }
    visited[v]=1;
    for(int w=0; w<G.vexnum; w++)
        if((G.arcs[v][w]!=0)&&(!visited[w]))
            Change(G,w,n,visited);
}

void NewPlace(AMGraph &G)
{
    int new_num,num,n,i,j;
    cout<<"输入新景点编码:";
    cin>>school[G.vexnum].num;
    if(CheckNum(school[G.vexnum].num,G))
    {
        cout<<"景点编码已存在!\n";
        return;
    }
    cout<<"输入新景点名称:";
    cin>>school[G.vexnum].name;
    cout<<"输入新景点简介:";
    cin>>school[G.vexnum].pro;
    G.vexs[G.vexnum]=school[G.vexnum];
    //cout<<G.vexs[G.vexnum].num<<' '<<G.vexs[G.vexnum].name<<"\n";
    for(int i=0; i<=G.vexnum; i++)
        G.arcs[i][G.vexnum]=MaxInt;
    cout<<"输入新景点相关路线信息(应包含两端点以及路线长度,输入0 0结束):\n";
    cin>>new_num>>num;
    while(new_num!=0)
    {
        new_num=new_num-1;
        num=num-1;
        n++;//增加边数
        cin>>G.arcs[new_num][num];
        G.arcs[num][new_num]=G.arcs[new_num][num];//注意编码比数组坐标大1!
        cin>>new_num>>num;
    }
    cout<<"景点【"<<school[G.vexnum].name<<"】创建成功";
    for(i=0; i<=G.vexnum; i++)
        for(j=0; j<=G.vexnum; j++)
            G.arcs[j][i]=G.arcs[i][j];
    G.vexnum++;
    G.arcnum=G.arcnum+n;
}

void ShortestPath_Floyd(AMGraph G)//佛洛伊德算法求vi,vj之间最短距离
{
    int i,j,k,D[MVNum][MVNum],path[MVNum][MVNum];
    int place[MVNum];
    int v0,v1;
    for(i=0; i<G.vexnum; i++)
        for(j=0; j<G.vexnum; j++)
        {
            D[i][j]=G.arcs[i][j];
            if(D[i][j]<MaxInt&&i!=j)
                path[i][j]=i;//j前驱为i
            else
                path[i][j]=-1;//j前驱为-1
        }
    for(k=0; k<G.vexnum; k++)
        for(i=0; i<G.vexnum; i++)
            for(j=0; j<G.vexnum; j++)
                if(D[i][k]+D[k][j]<D[i][j])//从i到k,再到j路径更短
                {
                    D[i][j]=D[i][k]+D[k][j];
                    path[i][j]=path[k][j];
                }
    for(i=0; i<G.vexnum; i++)
        for(j=0; j<G.vexnum; j++)
            if(i==j)
                D[i][j]=D[j][i]=0;
    cout<<"请输入起点:";
    cin>>v0;
    cout<<"请输入终点:";
    cin>>v1;
    v0--;
    v1--;//下标从0开始
    int t=v1;//v1接下来会改变,寄存给t
    i=0;
    cout<<"【"<<G.vexs[v0].name<<"】到【"<<G.vexs[v1].name<<"】的最短距离为 "<<D[v0][v1]<<" m\n";
    cout<<"\n其最短路线为 :【"<<G.vexs[v0].name<<"】<->";
    while(path[v0][v1]!=v0)
    {
        place[i]=path[v0][v1];
        i++;
        v1=path[v0][v1];
    }
    i--;
    for(i; i>=0; i--)
        cout<<"【"<<G.vexs[place[i]].name<<"】<->";
    cout<<"【"<<G.vexs[t].name<<"】"<<endl;
}

void DeleteRoad(AMGraph &G)
{
    int num1,num2;
    cout<<"输入删除路线端点:";
    cin>>num1>>num2;
    num1--;
    num2--;
    G.arcs[num1][num2]=MaxInt;
    G.arcs[num2][num1]=MaxInt;
    cout<<"删除【"<<G.vexs[num1].name<<"】到【"<<G.vexs[num2].name<<"】路线成功\n";
}
void Order(AMGraph G)
{
    while(1)
    {
        int x,num,visited[MVNum]= {0};;
        Menu();
        cin>>x;
        switch(x)
        {
        case 0:
            cout<<"\n成功退出程序...\n";
            return;
            break;

        case 1:
            PrintMap();
            system("pause");
            system("cls");
            break;

        case 2:
            ShortestPath_Floyd(G);
            system("pause");
            system("cls");
            break;

        case 3:
            NewPlace(G);
            system("pause");
            system("cls");
            break;

        case 4:
            DeleteRoad(G);
            system("pause");
            system("cls");
            break;

        case 5:
            cout<<"请输入查找景点编码:";
            cin>>num;
            if(!CheckNum(num,G))
                cout<<"无效编码!"<<endl;
            else
                PrintPlace(G,num);
            system("pause");
            system("cls");
            break;

        case 6:
            cout<<"要更改的景点编码:";
            cin>>num;
            if(!CheckNum(num,G))
                cout<<"无效编码!"<<endl;
            else
                Change(G,0,num-1,visited);
            system("pause");
            system("cls");
            break;

        case 7:
            DFS_AM(G,0,visited);
            system("pause");
            system("cls");
            break;
        default:
            cout<<"无效指令!"<<endl;
            system("pause");
            system("cls");
        }
    }
}
int main()
{
    AMGraph G;
    CreatMap(G);
    Order(G);
    return 0;
}
//小绵杨Yeanling
  • 34
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小绵杨Yancy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值