校园导航系统

#include<bits/stdc++.h>
using namespace std;

#define MAX 10 // 从校园中取10个点
#define INTMAX 66666
//Floyd算法数据
int L[MAX+1][MAX+1]; // 存最短路径长度
int D[MAX+1][MAX+1]; // 存最短路径点

// 地点结构体
typedef struct
{
    int siteNum; // 地点编号
    string siteName; // 地点名称
    string sitePresentation; // 地点介绍
}Site;

// 校园平面图
class SGraph
{
private:
    Site site[MAX+1]; // 校园
    int graph[MAX+1][MAX+1]; // 图的邻接矩阵
    int siteSum; // 地点数
    int pathSum;

public:
    // 默认为科大校园信息
    SGraph(){
        siteSum=10;
        pathSum=45;
        site[1].siteName="东门";
        site[2].siteName="春晖学堂";
        site[3].siteName="图书馆";
        site[4].siteName="文馨书院";
        site[5].siteName="秋实楼";
        site[6].siteName="逸夫楼";
        site[7].siteName="体育馆";
        site[8].siteName="颐园";
        site[9].siteName="3号楼";
        site[10].siteName="2号楼";

        site[1].siteNum=1;
        site[2].siteNum=2;
        site[3].siteNum=3;
        site[4].siteNum=4;
        site[5].siteNum=5;
        site[6].siteNum=6;
        site[7].siteNum=7;
        site[8].siteNum=8;
        site[9].siteNum=9;
        site[10].siteNum=10;

        site[1].sitePresentation="北华正门";
        site[2].sitePresentation="北华主教";
        site[3].sitePresentation="北华最喜欢的地方";
        site[4].sitePresentation="北华二教";
        site[5].sitePresentation="北华实验楼,含高配机房";
        site[6].sitePresentation="北华最气派的教学楼";
        site[7].sitePresentation="北华体测地点";
        site[8].sitePresentation="北华的食堂之一";
        site[9].sitePresentation="北华女寝之一,常见许多男子楼下等候女友";
        site[10].sitePresentation="北华混寝之一";
        for(int i=0;i<MAX;i++)
        {
            graph[i][0]=INTMAX;
            graph[0][i]=INTMAX;
        }
        graph[1][2]=79;
        graph[2][1]=79;
        graph[1][3]=567;
        graph[3][1]=567;
        graph[1][4]=667;
        graph[4][1]=667;
        graph[1][5]=901;
        graph[5][1]=901;
        graph[1][6]=1100;
        graph[6][1]=1100;
        graph[1][7]=1000;
        graph[7][1]=1000;
        graph[1][8]=928;
        graph[8][1]=928;
        graph[1][9]=872;
        graph[9][1]=872;
        graph[1][10]=364;
        graph[10][1]=364;
        graph[1][1]=INTMAX;
        graph[2][3]=505;
        graph[3][2]=505;
        graph[2][4]=591;
        graph[4][2]=591;
        graph[2][5]=791;
        graph[5][2]=791;
        graph[2][6]=1000;
        graph[6][2]=1000;
        graph[2][7]=950;
        graph[7][2]=950;
        graph[2][8]=850;
        graph[8][1]=850;
        graph[2][9]=410;
        graph[9][2]=410;
        graph[2][10]=386;
        graph[10][2]=386;
        graph[2][2]=INTMAX;
        graph[3][4]=384;
        graph[4][3]=384;
        graph[3][5]=435;
        graph[5][3]=435;
        graph[3][6]=829;
        graph[6][3]=829;
        graph[3][7]=905;
        graph[7][3]=905;
        graph[3][8]=756;
        graph[8][3]=756;
        graph[3][9]=450;
        graph[9][3]=450;
        graph[3][10]=667;
        graph[10][3]=667;
        graph[3][3]=INTMAX;
        graph[4][5]=450;
        graph[5][4]=450;
        graph[4][6]=552;
        graph[6][4]=552;
        graph[4][7]=829;
        graph[7][4]=829;
        graph[4][8]=905;
        graph[8][4]=905;
        graph[4][9]=756;
        graph[9][4]=756;
        graph[4][10]=450;
        graph[10][4]=450;
        graph[4][4]=INTMAX;
        graph[5][6]=444;
        graph[6][5]=444;
        graph[5][7]=561;
        graph[7][5]=561;
        graph[5][8]=511;
        graph[8][5]=511;
        graph[5][9]=752;
        graph[9][5]=752;
        graph[5][10]=1000;
        graph[10][5]=1000;
        graph[5][5]=INTMAX;
        graph[6][7]=137;
        graph[7][6]=137;
        graph[6][8]=586;
        graph[8][6]=586;
        graph[6][9]=926;
        graph[9][6]=926;
        graph[6][10]=1200;
        graph[10][6]=1200;
        graph[6][6]=INTMAX;
        graph[7][8]=521;
        graph[8][7]=521;
        graph[7][9]=861;
        graph[9][7]=861;
        graph[7][10]=1100;
        graph[10][7]=1100;
        graph[7][7]=INTMAX;
        graph[8][9]=427;
        graph[9][8]=427;
        graph[8][10]=884;
        graph[10][8]=884;
        graph[8][8]=INTMAX;
        graph[9][10]=458;
        graph[10][9]=458;
        graph[9][9]=INTMAX;
        graph[10][10]=INTMAX;


    }
    ~SGraph(){cout<<"\t\t\t\t\t平面图已释放"<<endl;}

    // 获取地点编号
    int getsiteNum(string siteName)
    {
        for(int i=1;i<=MAX;i++)
        {
            if(siteName==site[i].siteName)
            {
                return i;
            }
        }
        cout<<"\t\t\t\t\t未找到该地点!"<<endl;
        exit(0);
    }

    // 构建平面图
    void createSGraph()
    {
        // 存入地点信息
        for(int i=1;i<=MAX;i++)
        {
            site[i].siteNum=i;
            cout<<"\t\t\t\t\t请输入地点名称:";
            cin>>site[i].siteName;
            cout<<"\t\t\t\t\t请输入地点介绍:";
            cin>>site[i].sitePresentation;
        }

        // 存入平面图信息
        siteSum=MAX;
        cout<<"\t\t\t\t\t请输入边数:";
        cin>>pathSum;

        // 初始化边为无穷大
        for(int i=1;i<=MAX;i++)
        {
            for(int j=1;j<=MAX;j++)
            {
                graph[i][j]=INTMAX;
            }
        }
        // 存邻接矩阵
        for(int k=1;k<=pathSum;k++)
        {
            int siteNum1,siteNum2; // 起始地点编号、终止地点编号
            string siteName1,siteName2; // 起始地点名称、终止地点名称
            int length;
            cout<<"\t\t\t\t\t请输入起点:";
            cin>>siteName1;
            siteNum1=getsiteNum(siteName1);
            cout<<"\t\t\t\t\t请输入终点:";
            cin>>siteName2;
            siteNum2=getsiteNum(siteName2);
            cout<<"\t\t\t\t\t请输入长度:";
            cin>>length;
            graph[siteNum1][siteNum2]=length;
            graph[siteNum2][siteNum1]=length;
        }
        cout<<"\t\t\t\t\t[添加信息成功!]"<<endl;
        cout<<"\t\t\t\t\t";
        system("pause");
    }

    // 在D://学校编号.txt文件中存入数据
    void saveData()
    {
        cout<<"\t\t\t\t\t请输入学校编号:";
        int ischoolNum;
        cin>>ischoolNum;
        // 合成文件路径
        char cschoolNum[20];
        sprintf(cschoolNum,"%d",ischoolNum); // 将数据按照格式写入字符串
        char filePath[300]="D:\\计算机编程\\C_Dev-C++\\大二数据结构作业\\课程设计\\";
        strcat(filePath,cschoolNum);
        strcat(filePath,".txt");
        // 存入文件
        ofstream out(filePath);
        if(!out)
        {
            cout<<"\t\t\t\t\t文件保存失败!"<<endl;
            exit(0);
        }

        // 存邻接矩阵
        for(int i=1;i<=MAX;i++)
        {
            for(int j=1;j<=MAX;j++)
            {
                out<<graph[i][j]<<' ';
            }
        }
        out<<endl;
        // 存边数和点数
        out<<siteSum<<' '<<pathSum<<endl;
        // 存地点信息
        for(int i=1;i<=MAX;i++)
        {
            out<<site[i].siteNum<<endl;
            out<<site[i].siteName<<endl;
            out<<site[i].sitePresentation<<endl;
        }
        out.close();
        cout<<"\t\t\t\t\t[已成功保存数据!]"<<endl;
        cout<<"\t\t\t\t\t";
        system("pause");
    }

    // 从D://学校编号.txt文件中读取数据
    void readData()
    {
        cout<<"\t\t\t\t\t请输入学校编号:";
        int ischoolNum;
        cin>>ischoolNum;
        // 合成文件路径
        char cschoolNum[20];
        sprintf(cschoolNum,"%d",ischoolNum); // 将数据按照格式写入字符串
        char filePath[300]="D:\\计算机编程\\C_Dev-C++\\大二数据结构作业\\课程设计\\";
        strcat(filePath,cschoolNum);
        strcat(filePath,".txt");

        ifstream in(filePath);
        if(!in)
        {
            cout<<"\t\t\t\t\t!文件读取失败!"<<endl;
            exit(0);
        }

        // 读邻接矩阵
        for(int i=1;i<=MAX;i++)
        {
            for(int j=1;j<=MAX;j++)
            {
                in>>graph[i][j];
            }
        }
        // 读边数和点数
        in>>siteSum>>pathSum;
        // 读地点信息
        for(int i=1;i<=MAX;i++)
        {
            in>>site[i].siteNum;
            in>>site[i].siteName;
            in>>site[i].sitePresentation;
        }
        in.close();
        cout<<"\t\t\t\t\t[已成功读取数据!]"<<endl;
        cout<<"\t\t\t\t\t";
        system("pause");
    }

    // 查询地点信息
    void researchSite()
    {
        string siteName;
        int siteNum;
        cout<<"\t\t\t\t\t请输入你要查询的地点名称:";
        cin>>siteName;
        siteNum=getsiteNum(siteName);
        cout<<"\t\t\t\t\t地点编号:"<<site[siteNum].siteNum<<endl;
        cout<<"\t\t\t\t\t地点名称:"<<site[siteNum].siteName<<endl;
        cout<<"\t\t\t\t\t地点介绍:"<<site[siteNum].sitePresentation<<endl;
        cout<<"\t\t\t\t\t";
        system("pause");
    }

    // Floyd算法求最短路径
    void floyd()
    {

        // 初始化存最短路径长与最短路径的两个数组
        for(int i=1;i<=MAX;i++)
        {
            for(int j=1;j<=MAX;j++)
            {
                L[i][j]=graph[i][j];
                // 如果两个点有路径,就保存
                if(i!=j&&graph[i][j]<INTMAX)
                {
                    D[i][j]=i;
                }
                else
                {
                    D[i][j]=-1;
                }
            }
        }
        // 找最短路径,并记录最短路径长
        for(int k=1;k<=MAX;k++)
        {
            for(int i=1;i<=MAX;i++)
            {
                for(int j=1;j<=MAX;j++)
                {
                        if((L[i][k]+L[k][j])<L[i][j])
                        {
                            L[i][j]=L[i][k]+L[k][j];
                            D[i][j]=D[k][j];
                        }
                }
            }
        }
    }

    // 获取最短路径
    void getMinlength()
    {
        while(1)
        {
            string siteName1,siteName2;
            int siteNum1,siteNum2;
            cout<<"\t\t\t\t\t请输入要查找的起点名称:";
            cin>>siteName1;
            siteNum1=getsiteNum(siteName1);
            cout<<"\t\t\t\t\t请输入要查找的终点名称:";
            cin>>siteName2;
            siteNum2=getsiteNum(siteName2);
            if(siteNum1==siteNum2||siteNum1>MAX||siteNum1<1||siteNum2>MAX||siteNum2<1)
            {
                cout<<"\t\t\t\t\t[输入路径有误,请重新输入]"<<endl;
                continue;
            }
            else
            {
                cout<<"\t\t\t\t\t起点:"<<site[siteNum1].siteName<<endl;
                cout<<"\t\t\t\t\t终点:"<<site[siteNum2].siteName<<endl;
                cout<<"\t\t\t\t\t最短路径:";
                int dNum=D[siteNum1][siteNum2];
                if(dNum==-1)
                {
                    cout<<"无"<<endl;
                }
                else
                {
                    int minSite[MAX+1]; // 记录中间点
                    int ans=0; // 计数器
                    minSite[ans]=siteNum2;
                    ans++;
                    while(dNum!=siteNum1)
                    {
                        minSite[ans]=dNum;
                        ans++;
                        dNum=D[siteNum1][dNum];
                    }
                    minSite[ans]=siteNum1;
                    for(int i=ans;i>0;i--)
                    {
                        cout<<site[minSite[i]].siteName<<"--->";
                    }
                    cout<<site[minSite[0]].siteName<<", 路程为"<<L[siteNum1][siteNum2]<<"m"<<endl;
                    cout<<"\n\t\t\t\t\t";
                    system("pause");
                    break;
                }
            }
        }
    }
};

void display_MainActivity(); // 显示主界面

int main()
{
    SGraph sg;
    while(1)
    {
        display_MainActivity();
        int choice;
        cin>>choice;
        if(choice==1)
        {
            sg.createSGraph();
        }
        else if(choice==2)
        {
            sg.floyd();
            sg.getMinlength();
        }
        else if(choice==3)
        {
            sg.readData();
        }
        else if(choice==4)
        {
            sg.saveData();
        }
        else if(choice==5)
        {
            sg.researchSite();
        }
        else if(choice==6)
        {
            cout<<"\t\t\t\t\t[感谢您的使用]"<<endl;
            exit(0);
        }
        else
        {
            cout<<"\t\t\t\t\t[指令有误,请重新输入]"<<endl;
            cout<<"\t\t\t\t\t";
            system("pause");
        }

    }

}

void display_MainActivity()
{
    system("cls"); // 清屏
    int i; // 下标
    cout<<"\t\t\t\t\t#  #  #  #  #  #  #  #  #  #  #  #  #\n";
    cout<<"\t\t\t\t\t#                                   #\n";
    cout<<"\t\t\t\t\t#            校园导航系统           #\n";
    for(i=4; i<=5; i++)
    {
        cout<<"\t\t\t\t\t#                                   #\n";
    }
    cout<<"\t\t\t\t\t#            1.校园平面添加         #\n";
    cout<<"\t\t\t\t\t#                                   #\n";
    cout<<"\t\t\t\t\t#            2.最短路径查询         #\n";
    cout<<"\t\t\t\t\t#                                   #\n";
    cout<<"\t\t\t\t\t#            3.读取数据             #\n";
    cout<<"\t\t\t\t\t#                                   #\n";
    cout<<"\t\t\t\t\t#            4.保存数据             #\n";
    cout<<"\t\t\t\t\t#                                   #\n";
    cout<<"\t\t\t\t\t#            5.查询地点信息         #\n";
    cout<<"\t\t\t\t\t#                                   #\n";
    cout<<"\t\t\t\t\t#            6.退出系统             #\n";
    cout<<"\t\t\t\t\t#                                   #\n";
    cout<<"\t\t\t\t\t#  #  #  #  #  #  #  #  #  #  #  #  #\n";
    cout<<"\t\t\t\t\t               请输入您的指令:";
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【摘要】西南科技大学抓住西部大开发和绵阳科技城建设的历史机遇,践行“厚德、博学、笃行、创新”校训,建设出一座美丽的校园。为此通过对《数据结构》这一课程的应用,用图的模型对学校景点抽象。用邻接矩阵存储方法和狄克斯特拉算法及图的遍历实现对校园导游系统的模拟。此系统七个功能:浏览学校景点、查看单个景点信息、查看校园地图、导游推荐、查两景点最短路线、查两景点所有景点、退出系统。 目 录 一、问题描述及设计思路..............................................3 二、详细设计过程....................................................3 2.1设计校园平面图...............................................3 2.1.1景点分析.......................................................4 2.1.2平面图.........................................................4 2.2实现景点信息查询.............................................4 2.2.1景点存储.......................................................5 2.2.2景点信息查询功能实现...........................................5 2.3图实现路径查询...............................................5 2.3.1图的建立.......................................................5 2.3.2最短路径实现...................................................6 2.3.3两点间所有路径.................................................8 2.3.4路径查找设计结果...............................................8 三、结论体会.......................................................11 四、附录...........................................................12 4.1.1Mai.cpp.......................................................124.1.3Sight.h.......................................................13 4.1.2G.h...........................................................15 五、参考文献.......................................................20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值