怀化学院地图

#include<stdio.h>//无向带权图 
#include<stdlib.h>
#include<string.h>
#define Infinity 2000//表示无穷大 
#define MaxVertexNum 20 
#define MAX 40 
#define key 11//key为顶点个数 
typedef struct arcell//边的权值信息
{
    int adj;//权值  
}arcell, adjmatrix[MaxVertexNum][MaxVertexNum];//图的邻接矩阵类型
typedef struct vexsinfo//顶点信息 
{
    int position;//建筑的编号 
    char name[32];//建筑的名称 
    char introduction[256];//建筑的介绍 
    char super_introduction[512];//建的详细介绍 
}vexsinfo;
typedef struct mgraph//图结构信息
{
    vexsinfo vexs[MaxVertexNum];//顶点向量(数组) 
    adjmatrix arcs;//邻接矩阵 
    int vexnum, arcnum;//顶点数和边数 
}mgraph;
//全局变量
mgraph campus; //图变量(大学校园) 
int d[30];
int visited[30];
int shortest[MaxVertexNum][MaxVertexNum];//定义全局变量存储最小路径 
int pathh[MaxVertexNum][MaxVertexNum];//定义存储路径 
mgraph initgraph()
{
    int i = 0, j = 0;
    mgraph c;
    c.vexnum = 11;//顶点个数 
    c.arcnum = 20;//边的个数 
    for (i = 1; i <= key; i++)//依次设置顶点编号 
        c.vexs[i].position = i;
    //依次输入顶点信息  
    strcpy(c.vexs[1].name, "操场、天健楼"); strcpy(c.vexs[1].super_introduction, "\n操场:操场位于校园西侧,内设足球场、篮球场、田径场。是同学上体育课的绝佳地点。\n天健楼:“天行健,君子以自强不息”。天健楼是学校的体育馆,大部分的体育课活动在这里进行。\n");
    strcpy(c.vexs[1].introduction, "有足球场、篮球场、健身房等运动场地。");
    strcpy(c.vexs[2].name, "博学楼"); strcpy(c.vexs[2].super_introduction, "博学楼:位于学校西部,是商学院、外国语学院、马克思主义学院和法学院的所在地。内有许多特色的教师,如听力教室。\n");
    strcpy(c.vexs[2].introduction, "商学院、外国语学院、马克思主义学院和法学院的所在地");
    strcpy(c.vexs[3].name, "逸夫楼"); strcpy(c.vexs[3].super_introduction, "\n逸夫楼:是学院数学院的所在地,也是怀化学院的教学的重心。\n");
    strcpy(c.vexs[3].introduction, "数学院的所在地。");
    strcpy(c.vexs[4].name, "北门,明德广场"); strcpy(c.vexs[4].super_introduction, "\n北门:学校的最北面。\n明德广场:为学生提供的社交、娱乐的场所。\n");
    strcpy(c.vexs[4].introduction, "娱乐场地。");
    strcpy(c.vexs[5].name, "图书馆"); strcpy(c.vexs[5].super_introduction, "\n图书馆:是省内藏书最多的高校图书馆之一,内设多个学科借阅室。\n学术氛围浓厚。还经常开展读者俱乐部、读书沙龙等活动,繁荣了文化氛围。\n");
    strcpy(c.vexs[5].introduction, "读书圣地,建筑面积2000余平方米");
    strcpy(c.vexs[6].name, "厚德楼"); strcpy(c.vexs[6].super_introduction, "\n厚德楼:位于学校中心,是怀化学院标志性建筑。内有软件学院和文新院。学校机房主要所在。\n");
    strcpy(c.vexs[6].introduction, "学校中心。软件学院、文新院所在地。");
    strcpy(c.vexs[7].name, "一食堂"); strcpy(c.vexs[7].super_introduction, "\n一食堂:为学生提供用餐服务。是学校最大的食堂。\n");
    strcpy(c.vexs[7].introduction, "学校一食堂。");
    strcpy(c.vexs[8].name, "二食堂、宿舍9-10栋"); strcpy(c.vexs[8].super_introduction, "\n学校二食堂。和学生宿舍处于同一片区域。\n");
    strcpy(c.vexs[8].introduction, "学校二食堂");
    strcpy(c.vexs[9].name, "知行楼"); strcpy(c.vexs[9].super_introduction, "\n知行楼:怀化学院物电院所在地。是怀化学院新建的教学楼。设施配置齐全。\n");
    strcpy(c.vexs[9].introduction, "物电院所在地。");
    strcpy(c.vexs[10].name, "宽也楼"); strcpy(c.vexs[10].super_introduction, "\n宽也楼:怀化学院教师管理办公行政中心。\n");
    strcpy(c.vexs[10].introduction, "学校行政中心。");
    strcpy(c.vexs[11].name, "南门"); strcpy(c.vexs[11].super_introduction, "\n南门:为临近南门的住校学生提供了出行的方便。\n");
    strcpy(c.vexs[11].introduction, "距离小吃街、公交车站、超市较近");
    for (i = 1; i <= key; i++)
        for (j = 1; j <= key; j++)
            c.arcs[i][j].adj = Infinity;//先初始化图的邻接矩阵     
    c.arcs[1][2].adj = 200; c.arcs[1][6].adj = 400; c.arcs[1][7].adj = 500; c.arcs[1][11].adj = 520; c.arcs[2][3].adj = 280; c.arcs[2][5].adj = 200;
    c.arcs[3][4].adj = 260;c.arcs[3][5].adj = 250; c.arcs[3][10].adj = 380; c.arcs[4][10].adj = 130; c.arcs[5][6].adj = 230;
    c.arcs[6][2].adj = 200; c.arcs[6][7].adj = 140; c.arcs[6][9].adj = 200; c.arcs[7][8].adj = 240; c.arcs[7][11].adj = 80;
    c.arcs[8][6].adj = 320; c.arcs[8][9].adj = 175; c.arcs[9][10].adj = 35; c.arcs[9][10].adj = 160; c.arcs[10][6].adj = 380;
    for (i = 1; i <= key; i++)//邻接矩阵是对称矩阵,对称赋值(无向图需要对称赋值) 
        for (j = 1; j <= key; j++)
            c.arcs[j][i].adj = c.arcs[i][j].adj;
    return c;
}//initgraph
//2.查找建筑在图中的序号
int locatevex(mgraph c, int v)//locatevex
{
    int i;
    for (i = 1; i <= c.vexnum; i++)
        if (v == c.vexs[i].position)  return i;//找到,返回顶点序号i 
    return -1;//没有找到这个顶点 
}
//3.查找并输出序号为m,n建筑间的长度不超过8个建筑的路径 
void path(mgraph c, int m, int n, int k)
{
    int s, t = k + 1, length = 0;//t用于存放路径上下一个顶点对应的d[]数组元素的下标 
    if (d[k] == n && k < 8)//若d[k]是终点n且建筑个数<=8,则输出该路径 
    {
        for (s = 0; s < k; s++)//计算路径长度 
        {
            length = length + c.arcs[d[s]][d[s + 1]].adj;
        }
        if (length <= 100)//打印路径长度小于定长的路径 
        {
            for (s = 0; s < k; s++)//输出该路径。s=0时为起点m
            {
                printf("%d%s--->", d[s], c.vexs[d[s]].name);
            }
            printf("%d%s  ", d[s], c.vexs[d[s]].name);//输出最后一个建筑名(即顶点n的名字,此时s==k)    
            printf("总路线长为%d米\n\n", length);
        }
    }
    else
    {
        s = 1;
        while (s <= c.vexnum)//从第m个顶点,试探所有顶点是否有路径 
        {
            if ((c.arcs[d[k]][s].adj < Infinity) && (visited[s] == 0))//顶点m到顶点s有边(权值不为无穷大),且未被访问 
            {
                visited[s] = 1;
                d[k + 1] = s;//存储顶点编号 
                path(c, m, n, t);
                visited[s] = 0;//将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径 
            }
            s++;//试探从下一个顶点s开始是否有到终点的路径 
        }
    }
}
//4.查找两建筑间的建筑的所有路径
int allpath(mgraph c)
{
    int k, i, j, m, n;
    printf("\n\n请输入您想要查询的两个建筑的编号:\n\n");
    scanf("%d%d", &i, &j); printf("\n\n");
    m = locatevex(c, i);//locatevex 确定该顶点是否存在。若存在,返回该顶点编号。 
    n = locatevex(c, j);
    d[0] = m;//存储路径起点m(int d[]数组是全局变量) 
    for (k = 0; k < key; k++)//全部顶点访问标志初值设为0 
        visited[k] = 0;
    visited[m] = 1;//第m个顶点访问标志设置为1 
    path(c, m, n, 0);//调用程序。k=1,对应起点d[1]==m。k为d[]数组下标 
    return 1;
}
//5.用迪杰斯特拉算法,求出一个建筑到其他建筑间的最短路径,
void shortestpath_dij(mgraph c)
{
    int v0, v, w, k = 1, min, t, p;
    int final[MaxVertexNum];//final[w]=1表示已经求得顶点V0到Vw的最短路径
    int Patharc[MaxVertexNum];//用于存储最短路径下标的数组 
    int ShortPathtable[MaxVertexNum];//用于存储到各点最短路径的权值和 
    printf("\n请输入一个起始建筑的编号:");
    scanf("%d", &v0); printf("\n\n");
    while (v0<0 || v0>key)
    {
        printf("\n您输入的建筑编号不存在\n");
        printf("请重新输入:");
        scanf("%d", &v0);
    }
    //初始化数据
    for (v = 1; v <= c.vexnum; v++)//数组0还是空出来 
    {
        final[v] = 0;//全部顶点初始化为未找到最短路径 
        ShortPathtable[v] = c.arcs[v0][v].adj;//将与v0点有连线的顶点加上权值 
        Patharc[v] = 0;//初始化路径数组p为0 
    }
    ShortPathtable[v0] = 0; // V0至v0的路径为0 
    final[v0] = 1;//V0至v0不需要路径      
    //开始主循环,每次求得V0到某个v顶点的 最短路径 
    for (v = 1; v <= c.vexnum; v++)
    {
        min = Infinity;
        for (w = 1; w <= c.vexnum; w++)//找出最近的顶点和权值 
        {
            if (!final[w] && ShortPathtable[w] < min)//有边 
            {
                k = w;
                min = ShortPathtable[w];
            }
        }
        final[k] = 1;//将目前找到的最近的顶点置1 
        //修正当前最短路径及距离
        for (w = 1; w <= c.vexnum; w++)
        {    //如果经过v顶点的路径比现在这条路径的长度短的话,更新
            if (!final[w] && (min + c.arcs[k][w].adj < ShortPathtable[w]))
            {
                ShortPathtable[w] = min + c.arcs[k][w].adj;//修改当前路径长度
                Patharc[w] = k; //存放前驱结点(像糖葫芦) 
            }
        }
    }


    printf("打印P数组:");
    for (t = 1; t <= c.vexnum; t++)
    {
        printf("%d ", Patharc[t]);
    }
    printf("\n\n");
    //打印s数组
    printf("打印S数组:");
    for (t = 1; t <= c.vexnum; t++)
    {
        printf("%d ", ShortPathtable[t]);
    }
    printf("\n\n");

    //打印最短路径
    for (t = 1; t <= c.vexnum; t++)
    {
        p = t;
        if (t != v0)//反向输出 
        {
            printf("%d%s", t, c.vexs[t].name);
            for (w = 1; w <= c.vexnum; w++)
            {
                if (Patharc[p] != 0)
                {
                    printf("<--%d%s", Patharc[p], c.vexs[p].name);
                    p = Patharc[p];
                }
            }
            printf("<--%d%s", v0, c.vexs[v0].name);
            printf("\n总路线长为%d米\n\n", ShortPathtable[t]);
        }
    }
}
//菜单 
void menu()
{
    printf(" ┌──────────────────────────────────────────────────────┐\n");
    printf(" │ ╭ ═══════════════════════════════════════════════ ╮  │\n");
    printf(" │ ││        欢 迎 使 用 校 园 导 游 系 统          ││  │\n");
    printf(" │ ╰ ═══════════════════════════════════════════════ ╯  │\n");
    printf(" │                      欢迎来到                        │\n");
    printf(" │                    山东政法学院                      │\n");
    printf(" │                     菜 单 选 择                      │\n");
    printf(" │  *************************************************** │\n");
    printf(" │  *  1.菜单                **   2.查看游览路线(迪)* │\n");// 学校建筑介绍 
    printf(" │  *************************************************** │\n");
    printf(" │  *  3.查询建筑间最短路径  **   4.查询建筑间所有路径* │\n");
    printf(" │  *************************************************** │\n");
    printf(" │  *  5.学校建筑介绍        **   6.建筑信息查询      * │\n");// 
    printf(" │  *************************************************** │\n");
    printf(" │  *  7.学校地图            **   8.更改图信息        * │\n");
    printf(" │  *************************************************** │\n");
    printf(" │  *  0.退出                **   第一小组*^_^*       * │\n");
    printf(" │  *************************************************** │\n");
    printf(" └──────────────────────────────────────────────────────┘\n");
}
//以下是修改图的相关信息。包括建图、更新信息、删除、增加结点和边
//6.重新构造图 
int creatgraph(mgraph* c)
{
    int i, j, m, n, v0, v1, distance;
    printf("请输入图的顶点数和边数: \n");
    scanf("%d %d", &c->vexnum, &c->arcnum);
    printf("下面请输入建筑的信息: \n");
    for (i = 1; i <= c->vexnum; i++)
    {
        printf("请输入建筑的编号:");
        scanf("%d", &c->vexs[i].position);
        printf("\n请输入建筑的名称:");
        scanf("%s", &c->vexs[i].name);
        printf("\n请输入建筑的简介:");
        scanf("%s", &c->vexs[i].introduction);
        printf("\n请输入修改后建筑的详细介绍:");
        scanf("%s", &c->vexs[i].super_introduction);
    }
    for (i = 1; i <= c->vexnum; i++)
        for (j = 1; j <= c->vexnum; j++)//权值全部初始化为无穷 
            c->arcs[i][j].adj = Infinity;
    printf("下面请输入图的边的信息:\n");
    for (i = 1; i <= c->vexnum; i++)
    {
        printf("\n第%d条边的起点 终点 长度为:", i);
        scanf("%d %d %d", &v0, &v1, &distance);
        m = locatevex(campus, v0);//判断一下点是否存在,存在就返回位置 
        n = locatevex(campus, v1);
        if (m > 0 && n > 0)
        {
            c->arcs[m][n].adj = distance;
            c->arcs[n][m].adj = c->arcs[m][n].adj;
        }
    }
    return 1;
}
//7.更新图的部分信息。返回值:1***比如某个信息输错了,需要改 
int newgraph(mgraph* c)
{
    int changenum;
    int i, m, n, t, distance, v0, v1;
    printf("\n下面请输入您要修改的建筑的个数:\n");
    scanf("%d", &changenum);
    while (changenum<0 || changenum>key)
    {
        printf("\n输入错误!请重新输入");
        scanf("%d", &changenum);
    }
    for (i = 0; i < changenum; i++)
    {
        printf("\n请输入建筑的编号:");
        scanf("%d", &m);
        t = locatevex(campus, m);
        printf("\n请输入修改后建筑的名称:");
        scanf("%s", &c->vexs[t].name);
        printf("\n请输入修改后建筑的简介:");
        scanf("%s", &c->vexs[t].introduction);
        printf("\n请输入修改后建筑的详细介绍:");
        scanf("%s", &c->vexs[t].super_introduction);
    }
    printf("\n下面请输入您要更新的边数");
    scanf("%d", &changenum);
    while (changenum<0 || changenum>key)
    {
        printf("\n输入错误!请重新输入");
        scanf("%d", &changenum);
    }
    if (changenum != 0)
        printf("\n下面请输入更新边的信息:\n");
    for (i = 1; i <= changenum; i++)
    {
        printf("\n修改的第%d条边的起点 终点 长度为:", i);
        scanf("%d %d %d", &v0, &v1, &distance);
        m = locatevex(campus, v0);
        n = locatevex(campus, v1);
        if (m >= 0 && n >= 0)
        {
            c->arcs[m][n].adj = distance;
            c->arcs[n][m].adj = c->arcs[m][n].adj;
        }
    }
    return 1;
}
//8.增加一条边。返回值:1*** 
int enarc(mgraph* c)
{
    int m, n, distance;
    printf("\n请输入边的起点和终点编号,权值:");
    scanf("%d %d %d", &m, &n, &distance);
    while (m<0 || m>c->vexnum || n<0 || n>c->vexnum)
    {
        printf("输入错误,请重新输入:");
        scanf("%d %d", &m, &n);
    }
    if (locatevex(campus, m) < 0)
    {
        printf("此节点%d已删除", m);
        return 1;
    }
    if (locatevex(campus, n) < 0)
    {
        printf("此节点%d已被删除", n);
        return 1;
    }

    c->arcs[m][n].adj = distance;//在邻接矩阵中多加一个值 
    c->arcs[n][m].adj = c->arcs[m][n].adj;
    c->arcnum--;//图中边数+1
    return 1;
}
//9.增加一个结点。返回值:1*** 
int envex(mgraph* c)
{
    int i;
    c->vexnum++;//顶点个数+1
    printf("请输入您要增加结点的信息:");
    printf("\n编号:");
    scanf("%d", &c->vexs[c->vexnum].position);
    printf("名称:");
    scanf("%s", &c->vexs[c->vexnum].name);
    printf("简介:");
    scanf("%s", &c->vexs[c->vexnum].introduction);
    printf("详细介绍:");
    scanf("%s", &c->vexs[c->vexnum].super_introduction);

    for (i = 1; i <= c->vexnum; i++)
    {
        c->arcs[c->vexnum][i].adj = Infinity;
        c->arcs[i][c->vexnum].adj = Infinity;
    }
    return 1;
}
//10.删除图的一个顶点。返回值:1*** 
int delvex(mgraph* c)
{
    int i = 0, j;
    int m, v;
    if (c->vexnum <= 0)
    {
        printf("图中已无顶点");
        return 1;
    }
    printf("\n下面请输入您要删除的建筑编号:");
    scanf("%d", &v);
    while (v<0 || v>key)
    {
        printf("\n输入错误!请重新输入:");
        scanf("%d", &v);
    }
    m = locatevex(campus, v);
    if (m < 0)
    {
        printf("此顶点%d已删除\n", v);
        return 1;
    }
    for (i = m; i <= c->vexnum - 1; i++)
        for (j = 1; j <= c->vexnum; j++)//将二维数组中的第m+1行依次向前移动一行(删除第m行) 
            c->arcs[i][j] = c->arcs[i + 1][j];
    for (i = m; i <= c->vexnum - 1; i++)
        for (j = 1; j <= c->vexnum; j++)//将二维数组中的第m+1列依次向前移动一列(删除第m列)
            c->arcs[j][i] = c->arcs[j][i + 1];
    c->vexs[v].position = -1;//表示此点已删除,后期打印也不会显示该点 
    c->vexnum--;//顶点个数-1 
    return 1;
}
//11.删除图的一条边。返回值:1*** 
int delarc(mgraph* c)
{
    int m, n, v0, v1;
    if (c->vexnum <= 0)
    {
        printf("图中已无边,无法删除。");
        return 1;
    }
    printf("\n下面请输入您要删除的边的起点和终点编号:");
    scanf("%d %d", &v0, &v1);
    m = locatevex(campus, v0);
    if (m < 0)
    {
        printf("此%d顶点已删除", v0);
        return 1;
    }
    n = locatevex(campus, v1);
    if (n < 0)
    {
        printf("此%d顶点已删除", v1);
        return 1;
    }
    c->arcs[m][n].adj = Infinity;//将删掉的边的权值改为无穷 
    c->arcs[n][m].adj = Infinity;
    c->arcnum--;//图中边数减1 
    return 1;
}
//12.输出图的邻接矩阵的值*** 
void printmatrix(mgraph c)
{
    int i, j, k = 0;
    for (i = 1; i <= key; i++)
    {
        if (c.vexs[i].position != -1)
            printf("%6d", i);//横着的标号1到11
    }
    printf("\n");
    for (i = 1; i <= c.vexnum; i++)
    {
        for (j = 1; j <= c.vexnum; j++)
        {
            if (c.arcs[i][j].adj == Infinity)
                printf(" *#@* ");
            else
                printf("%6d", c.arcs[i][j].adj);
            k++;
            if (k % c.vexnum == 0) printf("\n");
        }
    }
}
//13.图的操作主调函数。返回值:1*** 
int changegraph(mgraph* c)
{
    int yourchoice;
    printf("(1)重新建图     (2)删除结点  (3)删除边\n");
    printf("(4)增加结点     (5)增加边    (6)更新信息\n");
    printf("(7)打印邻接矩阵 (8)返回上一级\n");
    do
    {
        printf("请输入您的选择:");
        scanf("%d", &yourchoice);
        switch (yourchoice)
        {
        case 1:creatgraph(c); break;
        case 2:delvex(c); break;
        case 3:delarc(c); break;
        case 4:envex(c); break;
        case 5:enarc(c); break;
        case 6:newgraph(c); break;
        case 7:printmatrix(campus); break;
        case 8:system("cls"); menu(); return 1;//break;
        default:printf("未找到该功能,请输入有效选项!\n"); break;
        }
    } while (yourchoice);
}
int user_log()
{
    int i;
    int a[6] = { 1,2,3,4,5,6 }, b[6];
    //for(i=0;i<6;i++)
        //printf("%d ",a[i]);
    printf("\n请输入6位密码(每输入一位密码间隔一个空格):\n");
    for (i = 0; i < 6; i++)
        scanf("%d", &b[i]);
    for (i = 0; i < 6; i++)
    {
        if (a[i] != b[i])
        {
            printf("密码错误!自动返回上一级\n"); menu(); return 0;
        }
    }
    printf("密码正确,登陆成功!\n\n");
    changegraph(&campus);
}
//14.查询两建筑间的最短路径(floyd算法)
void floyd(mgraph c)//一种暴力破解获取最短路径的算法 
{
    int i, j, k;
    for (i = 1; i <= key; i++)//将图的邻接矩阵赋值给 shortest二维数组,将矩阵pathh全部初始化为-1 
    {
        for (j = 1; j <= key; j++)
        {
            shortest[i][j] = c.arcs[i][j].adj;
            pathh[i][j] = j;
        }
    }
    int i1, j1, k1 = 0;
    for (i1 = 1; i1 <= key; i1++)
        printf("%6d", i1);//横着的标号1到11
    printf("\n");
    for (i1 = 1; i1 <= key; i1++)
    {
        printf("%d", i1);//竖着的标号1到11
        for (j1 = 1; j1 <= key; j1++)
        {
            printf("%6d", pathh[i1][j1]);
            k1++;
            if (k1 % key == 0) printf("\n");
        }
    }
    printf("\n\n\n");

    for (k = 1; k <= key; k++)//核心操作,完成了以k为中间点对所有的顶点对(i,j)进行检测和修改 
    {
        for (i = 1; i <= key; i++)
        {
            for (j = 1; j <= key; j++)
            {
                if (shortest[i][j] > shortest[i][k] + shortest[k][j])
                {
                    shortest[i][j] = shortest[i][k] + shortest[k][j];
                    pathh[i][j] = pathh[i][k];//记录一下所走的路 //P数组用来存放前驱顶点  
                }
            }
        }
    }
}
void printf_Pshuzu()
{
    int i, j, k = 0;
    for (i = 1; i <= key; i++)
        printf("%6d", i);//横着的标号0到11
    printf("\n");
    for (i = 1; i <= key; i++)
    {
        printf("%d", i);//竖着的标号0到11
        for (j = 1; j <= key; j++)
        {
            printf("%6d", pathh[i][j]);
            k++;
            if (k % key == 0) printf("\n");
        }
    }
    printf("\n\n\n");
}
//打印出最短路径 
void display(mgraph c, int i, int j)
{
    int a, b;
    a = i; b = j;
    printf("您要查询的两建筑间最短路径:\n\n");
    printf("%d%s", a, c.vexs[a].name);
    while (pathh[i][j] != b)
    {
        printf("-->%d%s", pathh[i][j], c.vexs[pathh[i][j]].name);
        i = pathh[i][j];
    }
    printf("-->%d%s\n\n", b, c.vexs[b].name);
    printf("%s-->%s的最短路径是:%d 米。\n\n", c.vexs[a].name, c.vexs[b].name, shortest[a][b]);
}
//任意两点间最短距离(弗洛伊德算法)
int shortdistance(mgraph c)
{
    int i, j;
    printf("请输入要查询的两个建筑的数字编号(1->11)中间用空格间隔开。\n");
    scanf("%d %d", &i, &j);
    if (i > key || i<0 || j>key || j < 0)
    {
        printf("输入信息错误!\n\n");
        printf("请输入要查询的两个建筑的数字编号(1->11)中间用空格间隔开。\n");
        scanf("%d %d", &i, &j);
    }
    else
    {
        floyd(c); printf_Pshuzu();
        display(c, i, j);
    }
    return 1;
}
//15.查询建筑的信息
void seeabout(mgraph c)
{
    int k;
    printf("\n请输入要查询的建筑编号:");
    scanf("%d", &k);
    while (k <= 0 || k > key)
    {
        printf("\n您所输入的建筑编号不存在!");
        printf("\n请重新输入建筑编号:");
        scanf("%d", &k);
    }
    printf("\n\n编号:%-4d\n", c.vexs[k].position);
    printf("\n建筑名称:%-10s\n", c.vexs[k].name);
    printf("\n详细介绍:%-80s\n\n", c.vexs[k].super_introduction);
}
//16.显示所有建筑信息
void browsecompus(mgraph c)
{
    int i;
    printf(" \n\n编号        建筑名称                   简介\n");
    printf("____________________________________________________________________________________________\n");
    for (i = 1; i <= key; i++)
    {
        if (c.vexs[i].position != -1)
            printf("%-10d%-25s%-80s\n", c.vexs[i].position, c.vexs[i].name, c.vexs[i].introduction);
    }
    printf("____________________________________________________________________________________________\n");
}
//17.山政地图
void school_map()//│││││   ┌┌┌   ╰╰╰╭═  ╭═  ═╰═ ╭╭=  =╮  =╯  =■□■□  ══=
{
    printf(" -------------------------------------------------山政地图------------------------------------------------\n");
    printf(" ---------------------------------------------------------------------------------------------------------\n");
    printf(" ___________                                                                                            ==\n");
    printf("││西操场 ││*                         致远楼                至善楼                            菜鸟驿站   == \n");
    printf("││_______││*                       * *  * * * * *  *  *  *   **   *  *  *  *  *  *  *  *  * *  * *  *   == \n");
    printf(" __________ *                     *        ##                *                       *     大学生    *  == \n");
    printf(" │鼎山楼 │ *-->***鼎山***茂陵山*                            *   ___________          *  自主学习中心  * ==\n");
    printf(" │_______│ *                              ##     文体馆     *   │        │          *     四餐         *东\n");
    printf(" __________ *                              ##               *   │ 东操场 │   三餐   * * * * * * ** * * *--> \n");
    printf(" │知行楼 │ *                              ##              *     │________│          *    _________     *门 \n");
    printf(" │_______│  *                    茂陵山        ##        *                          *    │慎行楼 │    * == \n");
    printf(" ##           *                 战役遗址         ##      *                          *    │_______│    * ==\n");
    printf(" ##            ****** 笃行楼    **********图书馆     ##  *                          *                 * ==\n");
    printf(" ##              *             *          * * * * * * * * * * * * * * * * * ** * * * * * * * * * *  *   ==\n");
    printf(" ##  停车场      *             *           ###           *                          _________           ==\n");
    printf(" ##              *             *           ###   澡堂    *                          │8、9号│            ==\n");
    printf(" ##  二餐        *    弘德楼   *           ###           *                          │_公寓_│            ==\n");
    printf(" ##  澡堂一      *             *  尚德楼   ### 教工餐厅  *                                              ==\n");
    printf(" ##  超市        *             *           ###           *            ==================================== \n");
    printf(" ##  一餐        *             *  司法鉴定 ###  校医院   *            ==  \n");
    printf(" ##  礼堂          *         *      中心   ###           *            ==    \n");
    printf(" ================ 山东政法学院 =======================小南门============  \n");
    printf(" ================     南门     =======================      ============\n");
    printf("\n                                                      西<---|--->东  \n");
}
//18.主要工作函数。操作区用户界面
void mainwork()
{
    menu();
    int yourchoice;
    campus = initgraph();
    do
    {
        printf("请输入您的选择:");
        scanf("%d", &yourchoice);
        switch (yourchoice)
        {
        case 1:system("cls"); menu(); break;
        case 2:system("cls"); shortestpath_dij(campus); break;
        case 3:system("cls"); shortdistance(campus); break;
        case 4:system("cls"); allpath(campus); break;
        case 5:system("cls"); browsecompus(campus); break;
        case 6:system("cls"); seeabout(campus); break;
        case 7:system("cls"); school_map(); break;
        case 8:system("cls"); user_log(); break;
        case 0:system("cls"); printf("谢谢使用\n"); break;
        default:printf("未找到该功能,请输入有效选项!\n"); break;
        }
    } while (yourchoice);
}
int main()
{
    system("color 1f");//背景颜色
    system("mode con: cols=140 lines=130");//程序页面长宽
    system("SchoolGraph.png");//调用校园地图 (就是一个图片)
    mainwork();
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值