数据结构与算法/大实验:校园导游系统

时间:2024-03-25 18:54:19

设计一个校园导游程序,为来学校的用户提供景点信息及路径查询服务。

① “景点信息查询”

系统为来访客人提供图中任意景点相关信息的查询功能。

用户选择该选项后,提示用户输入要查询的景点编号,根据景点编号显示出

该景点的名称和简介。

② “校门口到其他景点的路经查询”

系统为来访客人提供从校门口到图中任意景点的问路查询功能。

用户选择该选项后,提示用户输入要到达的景点编号,根据该景点编号显示

出从校门口到该景点的最短路径长度及路径信息(即路径上的顶点序列)

③ “校园各景点间的路经查询”

系统为为来访客人提供图中任意景点间的问路查询;

 用户选择该选项后,提示用户输入起点编号及终点编号,根据起点和终点编

号确定起点到终点的最短路径及长度并直观显示。

①设计学校的校园平面图(有向图,任意两点间的去边和回边长度相等),

所含景点不少于 10 个,以图中顶点表示校内各景点,存放景点名称、代号、简

介等信息,以边表示路径,存放路径长度等相关信息。

 ②利用教材上建立图的邻接矩阵的算法实现图的存储。

 ③根据查找算法实现功能 1。

④根据迪杰斯特拉算法和教材上的参考程序实现功能 2。

⑤根据弗洛伊德算法和教材上的参考程序实现功能 3

数据结构与算法/大实验:校园导游系统数据结构与算法/大实验:校园导游系统数据结构与算法/大实验:校园导游系统数据结构与算法/大实验:校园导游系统

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <stdlib.h>

#include <setjmp.h>

using namespace std;

#define MaxInt 32767//表示正无穷

#define MVNum 100//最大顶点数

#define OK 1

#define ERROR -1

#define OVERFLOW -2

jmp_buf j;

typedef struct

{

    char name[10];

    char info[50];

}Place;

typedef int Status;

typedef Place VerTexType;

typedef int ArcType;

typedef struct

{

    VerTexType vexs[MVNum];//顶点表

    ArcType arcs[MVNum][MVNum];//邻接矩阵

    int vexnum,arcnum;//图的当前点数和边数

}AMGraph;

 

typedef struct stack

{

    int *base;

    int *top;

    int stacksize;

}SqStack;

 

 

int path[11][11];

int D[11][11];

bool isVisited[MaxInt];

SqStack S;

 

 

 

Status CreateUDN (AMGraph &G)//创建地图的邻接矩阵模型

{

    G.vexnum = 11;

    G.arcnum = 15;

    strcpy(G.vexs[0].name,"正门");strcpy(G.vexs[0].info,"学校的正门。校训:博学深思,参天尽物");

    strcpy(G.vexs[1].name,"主楼");strcpy(G.vexs[1].info,"学校的行政办公中心");

    strcpy(G.vexs[2].name,"二号楼");strcpy(G.vexs[2].info,"二号楼,学校教学场所,外语学院的教学楼。");

    strcpy(G.vexs[3].name,"外事三号楼");strcpy(G.vexs[3].info,"有关出国留学事务的咨询办公楼");

    strcpy(G.vexs[4].name,"联通广场");strcpy(G.vexs[4].info,"标准化跑道,适宜锻炼身体的场所");

    strcpy(G.vexs[5].name,"一号楼");strcpy(G.vexs[5].info,"一号楼,学校的机房教学楼之一,有七十年左右的历史");

    strcpy(G.vexs[6].name,"图书馆");strcpy(G.vexs[6].info,"藏书丰富,设施良好,知识的摇篮");

    strcpy(G.vexs[7].name,"汇文楼");strcpy(G.vexs[7].info,"学校的主要教学楼,承载黑大学子的梦想");

    strcpy(G.vexs[8].name,"实验楼");strcpy(G.vexs[8].info,"雅思考试考场之一,标准化机房。");

    strcpy(G.vexs[9].name,"四号楼");strcpy(G.vexs[9].info,"计算机学院、创业教育学院");

    strcpy(G.vexs[10].name,"三号楼");strcpy(G.vexs[10].info,"C区主要教学楼");

 

    for(int i = 0;i<G.vexnum;i++)

        cout<<G.vexs[i].name<<endl;

    for(int i = 0;i<G.vexnum;i++)//初始化邻接矩阵使边的权值均为MAXINT

        for(int j = 0;j<G.vexnum;j++)

            G.arcs[i][j] = MaxInt;

    G.arcs[0][1] = 50;G.arcs[0][3] = 150;

    G.arcs[1][2] = 20;G.arcs[1][3] = 50;

    G.arcs[2][3] = 160;G.arcs[2][4] = 60;

    G.arcs[3][6] = 300;G.arcs[4][5] = 100;

    G.arcs[5][6] = 200;G.arcs[5][7] = 350;

    G.arcs[6][8] = 180;G.arcs[7][8] = 240;

    G.arcs[7][9] = 550;G.arcs[8][10] = 450;

    G.arcs[9][10] = 50;

    G.arcs[1][0] = 50;G.arcs[3][0] = 150;

    G.arcs[2][1] = 20;G.arcs[3][1] = 50;

    G.arcs[3][2] = 160;G.arcs[4][2] = 60;

    G.arcs[6][3] = 300;G.arcs[5][4] = 100;

    G.arcs[6][5] = 200;G.arcs[7][5] = 350;

    G.arcs[8][6] = 180;G.arcs[8][7] = 240;

    G.arcs[9][7] = 550;G.arcs[10][8] = 450;

    G.arcs[10][9] = 50;

    for(int i = 0;i<G.vexnum ;i++)

    {

            G.arcs[i][i]=0;

    }

    for(int i =0;i<G.vexnum;i++)

    {

        for(int j = 0;j<G.vexnum;j++)

        {

            cout<<"\t"<<G.arcs[i][j];

        }

        cout<<endl;

    }

    return OK;

}

 

Status InitStack (SqStack &S)

{

    S.base = new int;

    if(!S.base)cout<<"ERROR";

    S.top = S.base;

    S.stacksize = 100;

    return OK;

}

Status Push(SqStack &S,int e)

{

    if(S.top - S.base == S.stacksize)return ERROR;

    *S.top++ = e;

    return OK;

}

Status Pop(SqStack &S,int &e)

{

    if(S.top == S.base)return 0;

    int *temp;

    temp = S.top;

    S.top--;

    delete temp;

    e = *S.top;

    return OK;

}

void ShowStack(SqStack &S)

{

    int *top = S.top;

    while(S.base != top)

    {

 

        cout<<(*(top-1))<<" ";

                top--;

    }

    cout<<"over "<<endl;

}

int GetIndex(AMGraph &G,VerTexType v)

{

    int index = -1;

    for(int i=0;i<G.vexnum;i++)

    {

        if(v.name == G.vexs[i].name){return i;}//获取v1下标

    }

    return index;

}

void ShowInfo(AMGraph &G)

{

    int choice;

    cout<<"请输入你要查询的地点序号:";cin>>choice;

    cout<<G.vexs[choice].info<<endl;

    return;

}

void ShortertPath_Floyd(AMGraph &G)

{

    for(int i = 0;i<G.vexnum;i++)

    {

        for(int j = 0;j<G.vexnum;j++)

            {

                D[i][j] = G.arcs[i][j];

                if((D[i][j]<MaxInt)&&(i!=j))path[i][j]=i;

                else path[i][j] = -1;

            }

    }

    for(int k = 0;k<G.vexnum;++k)

        {

            for(int i = 0;i<G.vexnum;++i)

            {

                for(int j = 0;j<G.vexnum ;++j)

                {

                    if(D[i][k]+D[k][j]<D[i][j])

                        {

                            D[i][j] = D[i][k]+D[k][j];

                            path[i][j] = path[k][j];

                        }

                }

            }

        }

    cout<<"path"<<endl;

    for(int i = 0;i<G.vexnum;i++)

        {

            for(int j = 0;j<G.vexnum;j++)

            {

                cout<<"\t"<<path[i][j];

            }

            cout<<endl;

        }

        cout<<"D:"<<endl;

    for(int i = 0;i<G.vexnum;i++)

        {

            for(int j = 0;j<G.vexnum;j++)

            {

                cout<<"\t"<<D[i][j];

            }cout<<endl;

        }

//    for(int i = 0;i<G.vexnum ;i++)

//    {

//        for(int j = 0;j<G.vexnum;j++)

//            cout<<D[i][j]<<"\t";

//            cout<<endl;

//    }

 

}

void Road(AMGraph &G,int v1,int v2)

{

    int temp = v2;

    do{

            Push(S,temp);

            temp = path[v1][temp];

    }while(*(S.top-1)!=v1);

    ShowStack(S);

    InitStack(S);

}

 

int main()

{

    //邻接矩阵部分

    AMGraph G;

    InitStack(S);

    CreateUDN(G);

 

    ShortertPath_Floyd(G);

 

 

    cout<<endl;

    while(1)

    {system("cls");

        cout<<"****************************************************************"<<endl;

        cout<<"*                  黑龙江大学校园导游系统                      *"<<endl;

        cout<<"*          1、景点信息查询                                     *"<<endl;

        cout<<"*          2、校门口到其他景点的路经查询(单源最短路径)       *"<<endl;

        cout<<"*          3、校园各景点间的路经查询(各顶点对间最短路径)     *"<<endl;

        cout<<"****************************************************************"<<endl;

        cout<<"请输入你的选项:";

        int choice;

        cin>>choice;

        if(choice == 1)

        {

            ShowInfo(G);

            getchar();

            getchar();

        }else if(choice == 2)

        {

            cout<<"请输入你要去哪里:";

            int aim;

            cin>>aim;

            Road(G,0,aim);

            getchar();

            getchar();

        }else if(choice == 3)

        {

            int from;

            cout<<"请输入你要从哪里出发:";

            cin>>from;

            cout<<"请输入你要去哪里:";

            int aim;

            cin>>aim;

            Road(G,from,aim);

            getchar();

            getchar();

        }

        else{

            cout<<"输入错误,请重试"<<endl;

            getchar();

            getchar();

        }

        

    }

    return 0;

 

}