数据结构 校园导航系统

数据结构实训 校园导航系统

设计校园导游系统,为来访的客人提供各种信息查询服务。

山东工商学院校园导航

(一)基本要求
1、设计学校的校园平面图,所含景点10-15个。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
2、为来访客人提供图中任意景点相关信息的查询。
3、为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
4、提供图中任意景点问路查询,即求任意两个景点之间的所有路径。
5、提供校园图中多个景点的最佳访问路线查询,即求途经这多个景点的最佳路径。
6、区分汽车线路与步行线路。
7、设计一实用的查询界面和功能菜单。
(二)、选做内容
1、扩充道路信息,如道路类别(车道、人行道等)、沿途景色等级,以至可按客人所需分别查询人行路径和车行路径或观察路径。
2、扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
3、实现校园导游图的仿真界面。

1、具体函数
void DFS();步行深度优先搜索
void DFS1();乘车深度优先搜索
void Search();景点查询
void make_site();//景点介绍
void make_map();//数据地图化
void DIS();
void dijstra();//迪杰斯特拉算法
void mshort();//最短距离
void ashort();//所有路径
int menu();//菜单栏
void maps();//打印地图
void Floyd();//弗洛伊德算法
void Floyd_print();打印多景点最优路径
void Multispot();
2、程序实现

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <string>
#include <stack>
#include <deque>
#include<numeric>
#include<vector>
using namespace std;
#define MAX 0x3f3f3f
#define PP 999999
stack<int> S;
int dis[16],vis[16];
int dist[20][20];
int path[20],path1[20][20];
const int MAXV=1001,INF=1000001;
bool vest[MAXV];
int nex[MAXV],d[MAXV][MAXV];
int N,M,st,ed,cnt=0;
struct site //景点信息
{
    int number; //编号
    char name[20];//名称
    char infor[100];//介绍
};
struct maps //景点的图
{
    int point; //地点
    int side; //边
    site s[20];
    int edge[20][20];
    int edge_car[20][20];
} m;
void DFS(int i)
{
    vest[i]=true;
    if(i==ed)
    {
        cnt++;
        printf("第%d条路径如下",cnt);
        int k=st;
        while(k!=ed)
        {
            printf("%d->",k);
            k=nex[k];
        }
        printf("%d\n",k);
        return;
    }

    for(int j=1; j<=m.point; j++)
    {
        if(vest[j]==false&&m.edge[i][j]!=MAX)
        {
            nex[i]=j;//对于路径0->1->3: nex[0]=1;nex[1]=3;
            DFS(j);
            vest[j]=false;
        }
    }
}
void DFS1(int i)
{
    vest[i]=true;
    if(i==ed)
    {
        cnt++;
        printf("第%d条路径如下",cnt);
        int k=st;
        while(k!=ed)
        {
            printf("%d->",k);
            k=nex[k];
        }
        printf("%d\n",k);
        return;
    }

    for(int j=1; j<=m.point; j++)
    {
        if(vest[j]==false&&m.edge_car[i][j]!=MAX)
        {
            nex[i]=j;//对于路径0->1->3: nex[0]=1;nex[1]=3;
            DFS1(j);
            vest[j]=false;
        }
    }
}
void Search()
{
    int i,n;
    printf("山东工商学院东校区的景点有:\n");
    printf("****************\n");
    for(i=1; i<=14; i++)
    {
        printf("*******%d:%s\n",m.s[i].number,m.s[i].name);
    }
    printf("****************\n");
    while(1)
    {
        printf("请输入你想要查询的景点编号:\n");
        printf("按0退出\n");
        scanf("%d",&n);
        getchar();
        if(n==0)
        {
            break;
        }
        else if(n<1||n>14)
        {
            printf("输入有误,请重新输入!!!\n\n");
            continue;
        }
        else
        {
            printf("%d:%s\n",m.s[n].number,m.s[n].name);
            printf("%s\n\n",m.s[n].infor);
        }
    }
    return ;
}
void make_site()
{
    int i;
    for(i=1; i<=m.point; i++)
        m.s[i].number=i;
    strcpy(m.s[1].name,"实验楼");
    strcpy(m.s[1].infor,"新建计科院楼");
    strcpy(m.s[2].name,"逸夫楼");
    strcpy(m.s[2].infor,"邵逸夫先生捐建");
    strcpy(m.s[3].name,"家属楼");
    strcpy(m.s[3].infor,"学校职工的住宅");
    strcpy(m.s[4].name,"餐厅");
    strcpy(m.s[4].infor,"山商东校餐厅");
    strcpy(m.s[5].name,"大学生活动中心");
    strcpy(m.s[5].infor,"举办文艺活动的场所");
    strcpy(m.s[6].name,"图书馆");
    strcpy(m.s[6].infor,"学校图书存放处、学生自习室");
    strcpy(m.s[7].name,"宿舍");
    strcpy(m.s[7].infor,"东校学生休息生活区");
    strcpy(m.s[8].name,"办公楼");
    strcpy(m.s[8].infor,"1--7楼为学生教室,8楼以上为学校办公场所");
    strcpy(m.s[9].name,"四教");
    strcpy(m.s[9].infor,"第四座教学楼");
    strcpy(m.s[10].name,"二教");
    strcpy(m.s[10].infor,"第二座教学楼");
    strcpy(m.s[11].name,"东操场");
    strcpy(m.s[11].infor,"东校田径运动场");
    strcpy(m.s[12].name,"五教");
    strcpy(m.s[12].infor,"第五座教学楼");
    strcpy(m.s[13].name,"三教");
    strcpy(m.s[13].infor,"第三座教学楼");
    strcpy(m.s[14].name,"体育馆");
    strcpy(m.s[14].infor,"室内篮球场以及各种赛事举办场");
}
void make_map()
{
    int i,j;
    m.point=14;
    m.side=17;
    for(i=0; i<=m.point; i++)
        for(j=0; j<=m.point; j++)
        {
            m.edge[i][j]=MAX;
            m.edge_car[i][j]=MAX;
        }
    /*memset(m.edge,MAX,sizeof(m.edge));
    memset(m.edge_car,MAX,sizeof(m.edge_car));
    fill(m.edge[0],m.edge[0]+20*20,MAX);*/
    memset(dis,MAX,sizeof(dis));
    memset(vis,0,sizeof(vis));
    fill(vest,vest+MAXV,false);
    fill(d[0],d[0]+MAXV*MAXV,INF);

    d[0][2]=m.edge[1][3]=m.edge[3][1]=80;
    d[1][2]=m.edge[2][3]=m.edge[3][2]=50;
    d[2][3]=m.edge[3][4]=m.edge[4][3]=120;
    d[2][4]=m.edge[3][5]=m.edge[5][3]=50;
    d[4][5]=m.edge[5][6]=m.edge[6][5]=80;
    d[4][7]=m.edge[5][8]=m.edge[8][5]=50;
    d[4][8]=m.edge[5][9]=m.edge[9][5]=50;
    d[5][9]=m.edge[6][10]=m.edge[10][6]=40;
    d[7][8]=m.edge[8][9]=m.edge[9][8]=50;
    d[8][9]=m.edge[9][10]=m.edge[10][9]=60;
    d[3][6]=m.edge[4][7]=m.edge[7][4]=60;
    d[6][9]=m.edge[7][10]=m.edge[10][7]=55;
    d[6][10]=m.edge[7][11]=m.edge[11][7]=60;
    d[6][13]=m.edge[7][14]=m.edge[14][7]=70;
    d[9][12]=m.edge[10][13]=m.edge[13][10]=80;
    d[11][12]=m.edge[12][13]=m.edge[13][12]=50;
    d[12][13]=m.edge[13][14]=m.edge[14][13]=50;
    d[0][2]=m.edge_car[2][4]=m.edge_car[4][2]=180;
    m.edge_car[4][11]=m.edge_car[11][4]=160;
    m.edge_car[11][14]=m.edge_car[14][11]=40;
    m.edge_car[14][12]=m.edge_car[12][14]=120;
    m.edge_car[12][8]=m.edge_car[8][12]=100;

}
void DIS(int a,int b,int c)//计算dis数组
{
    memset(path,0,sizeof(path));
    int i,j,pos=1,minn;
    memset(vis,0,sizeof(vis));
    for(i=1; i<=m.side; i++)
    {
        if(a==1)
            dis[i]=m.edge[b][i];
        if(a==2)
            dis[i]=m.edge_car[b][i];
    }
    vis[b]=1;
    dis[b]=0;
    for(i=1; i<=m.point; i++)
    {
        minn=MAX;
        for(j=1; j<=m.point; j++)
        {
            if(vis[j]==0&&minn>dis[j])
            {
                minn=dis[j];
                pos=j;
            }
        }
        vis[pos]=1;
        for(j=1; j<=14; j++)
        {
            if(a==1)
            {
                if(vis[j]==0&&dis[j]>dis[pos]+m.edge[pos][j])
                {
                    dis[j]=dis[pos]+m.edge[pos][j];
                    path[j]=pos;
                }
            }
            if(a==2)
            {
                if(vis[j]==0&&dis[j]>dis[pos]+m.edge_car[pos][j])
                {
                    dis[j]=dis[pos]+m.edge_car[pos][j];
                    path[j]=pos;
                }
            }
        }
    }
}
void dijstra(int b,int a,int c)
{
    DIS(a,b,c);
    int x=c;
    while(!S.empty())
        S.pop();
//    for(i=1;i<=15;i++)
//        cout<<i<<" "<<path[i]<<endl;
//    cout<<endl;
    while(1)
    {
        if(x==0)
            break;
        S.push(x);
        x=path[x];
    }
    S.push(b);
    if(dis[c]>=100000)
        printf("没有直达的路,请选择步行。\n");
    else
    {
        printf("从%d到%d的最短路径为:",b,c);
        while(!S.empty())
        {
            if(S.size()>1)
                cout<<S.top()<<"->";
            else
                cout<<S.top();
            S.pop();
        }
        printf("其最短距离为:%d",dis[c]);
    }

}
void mshort()
{
    int a,b,c;
    printf("=====出行方式=====\n");
    printf("1.步行\n");
    printf("2.驾车\n");
    printf("==================\n");
    printf("选择出行方式\n");
    scanf("%d",&a);
    printf("输入起点\n");
    scanf("%d",&b);
    printf("输入终点\n");
    scanf("%d",&c);
    if((b<=0&&b>=16)||(c<=0&&c>=16))
    {
        printf("输入错误");
    }
    else
        dijstra(b,a,c);

}
void ashort()
{
    int a,b,c;
    printf("=====出行方式=====\n");
    printf("1.步行\n");
    printf("2.驾车\n");
    printf("==================\n");
    printf("选择出行方式\n");
    scanf("%d",&a);
    printf("输入起点\n");
    scanf("%d",&b);
    printf("输入终点\n");
    scanf("%d",&c);
    if((b<=0&&b>=16)||(c<=0&&c>=16))
    {
        printf("输入错误");
    }
    else
    {
        st=b;
        ed=c;
        if(a==1)
            DFS(st);
        if(a==2)
            DFS1(st);
    }
}
int menu()
{
    int n;
    printf("\n");
    printf("       ************欢迎使用山东工商学院导游系统***************\n\n");
    printf("       *                  1.山商景点信息查询                 *\n");
    printf("       *                  2.两景点之间最短路查询             *\n");
    printf("       *                  3.两景点间所有路径查询             *\n");
    printf("       *                  4.多景点间访问路线查询             *\n");
    printf("       *                  5.退出系统                         *\n");
    printf("       *******************************************************\n");
    printf("输入指令:\n");
    scanf("%d",&n);
    getchar();
    return n;
}
void maps()
{
    printf("\n                          *山商东校区校园景点地图*\n\n");
    printf("                                                                    (14)体育馆    \n");
    printf("                                       (12)五教      (13)三教        ◎           \n");
    printf("                                       ◎              ◎--------------| (11)东操场 \n");
    printf("                                        |-------------|              |     ◎     \n");
    printf("                                                      |              |    /       \n");
    printf("                    办         (9)四教                |              |   /        \n");
    printf("                    公         ◎            (10)二教  |              |  /         \n");
    printf("                (8) 楼◎--------|----------------------◎--------------| /          \n");
    printf("                       \       |                      |              ◎           \n");
    printf("                        \      |                      |          (7) 宿舍         \n");
    printf("                         \     |                      ◎             |            \n");
    printf("                          \   /                       |(6)图书馆     |            \n");
    printf("                     |-----◎-------------------------|              |            \n");
    printf("        (1)实验楼◎  |     (5)大学生活动中心                         |            \n");
    printf("           |         |                                               |            \n");
    printf("           |---------◎(3)家属楼--------------------------------------◎(4)餐厅   \n");
    printf("                     |                                                            \n");
    printf("    (2)西校逸夫楼◎--|                                                            \n");
}
void Floyd()
{
    int i,j,k;
    for(i=1; i<=m.point; i++)
    {
        for(j=1; j<=m.point; j++)
        {
            dist[i][j]=m.edge[i][j];
            if(i!=j&&dist[i][j]<PP)
            {
                path1[i][j]=i;
            }
            else
            {
                path1[i][j]=-1;
            }
        }
    }
    //printf("%d\n",g.n);
    for(k=1; k<=m.point; k++)
    {
        for(i=1; i<=m.point; i++)
        {
            for(j=1; j<=m.point; j++)
            {
                if(dist[i][j]>(dist[i][k]+dist[k][j]))
                {
                    dist[i][j]=dist[i][k]+dist[k][j];
                    path1[i][j]=k;
                }
            }
        }
    }
    return ;
}
void Floyd_print(int s, int e)
{
    if(path1[s][e]==-1||path1[s][e]==e||path1[s][e]==s)
    {
        return;
    }
    else
    {
        Floyd_print(s,path1[s][e]);
        printf("%s->",m.s[path1[s][e]].name);
        Floyd_print(path1[s][e],e);
    }
}
void Multispot()
{
    int vNum[20]= {0};
    int i,j,dis1,a;
    j=1;
    dis1=0;
    printf("请输入你要游览的第%d个景点的编号(输入-1结束输入):",j);
    scanf("%d",&vNum[j]);
    while(vNum[j]!=-1&&j<=14)
    {
        printf("请输入你要游览的第%d个景点编号:",++j);
        scanf("%d", &vNum[j]);
        if(vNum[j]!=-1)
            a=vNum[j];
        if(vNum[j]==-1)
        {
            break;
        }
    }
    printf("\n这是最佳访问路径:");
    for(i=0; vNum[i+1]>0&&vNum[i+2]>0; i++)
    {
        printf("%s->",m.s[vNum[i+1]].name);
        Floyd_print(vNum[i+1],vNum[i+2]);
        dis1+=dist[vNum[i+1]][vNum[i+2]];
    }
    printf("%s\n\n",m.s[a].name);
    printf("全程总长为:%dm\n\n",dis1);
}

int main()
{
    int n;
    maps();
    make_map();
    make_site();
    while(1)
    {
        n=menu();
        if(n<1||n>5)
            printf("输入错误,请重新输入\n");
        else
        {
            if(n==1)
                Search();
            else if(n==2)
                mshort();
            else if(n==3)
                ashort();
			else if(n==4)
            {
                maps();
                Floyd();
                Multispot();
            }

			else if(n==0)
				break;

        }

    }
}

在这里插入图片描述
3、总结
校园导游系统,可以查看校园景点图,可以查看景点的信息,道路也分为人行道和车行道,还可以查找两景点间的最短路径和所有路径,还可以根据想去看的所有景点推荐一个最佳路径。程序中用了最短路算法和最小生成树算法,还有深搜算法。

  • 42
    点赞
  • 289
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
校园导航系统是一个基于数据结构C语言程序,主要功能是实现校园地图的导航和最短路径的输出。该程序需要读者自己进行一些景点介绍和校园介绍的存储路径的更改,才能成功实现导航功能。该程序使用了图的数据结构,通过Dijkstra算法实现最短路径的计算。如果您想了解更多关于该程序的实现细节,可以参考引用的文章。 以下是一个简单的Dijkstra算法的实现,用于计算从起点到终点的最短路径: ```c #include <stdio.h> #include <limits.h> #define V 9 int minDistance(int dist[], bool sptSet[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) min = dist[v], min_index = v; return min_index; } void printPath(int parent[], int j) { if (parent[j] == -1) return; printPath(parent, parent[j]); printf("%d ", j); } void printSolution(int dist[], int n, int parent[], int src, int dest) { printf("Shortest path from %d to %d:\n", src, dest); printf("Vertex Distance Path\n"); for (int i = 0; i < V; i++) { if (i == dest) { printf("%d \t\t %d\t\t%d ", i, dist[i], src); printPath(parent, i); } } } void dijkstra(int graph[V][V], int src, int dest) { int dist[V]; bool sptSet[V]; int parent[V]; for (int i = 0; i < V; i++) { parent[src] = -1; dist[i] = INT_MAX; sptSet[i] = false; } dist[src] = 0; for (int count = 0; count < V - 1; count++) { int u = minDistance(dist, sptSet); sptSet[u] = true; for (int v = 0; v < V; v++) { if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) { parent[v] = u; dist[v] = dist[u] + graph[u][v]; } } } printSolution(dist, V, parent, src, dest); } int main() { int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0}, {4, 0, 8, 0, 0, 0, 0, 11, 0}, {0, 8, 0, 7, 0, 4, 0, 0, 2}, {0, 0, 7, 0, 9, 14, 0, 0, 0}, {0, 0, 0, 9, 0, 10, 0, 0, 0}, {0, 0, 4, 14, 10, 0, 2, 0, 0}, {0, 0, 0, 0, 0, 2, 0, 1, 6}, {8, 11, 0, 0, 0, 0, 1, 0, 7}, {0, 0, 2, 0, 0, 0, 6, 7, 0}}; dijkstra(graph, 0, 8); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值