OUC校园导游
大二专业课太多,都没有好好的在博客上面做笔记,以备后面用的时候可以查找看一下,下面是写的不是完全正确的与图相关的代码~~希望指正~~
/*
Name:
Copyright:
Author:Hxm
Date: 2016/05/16 22:57
Description: 实验四(必做,设计性实验,6学时)
实验题目:校园导游咨询实验
目的:掌握图的存储方法和最短路经算法。
实验内容:设计一个校园导游程序,为来访客人提供各种信息查询服务。
测试数据根据实际情况指定。提示:一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向图。顶点和边均含有相关信息。
实验要求: 1、设计所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;
以边表示路径,存放路径长度等相关信息。
2、为来访客人提供图中任意景点相关信息的查询。
3、为来访客人提供图中任意景点的纹路查询,即查询任意两个景点之间的一条最短的简单路径。
实验内容和实验步骤:(由学生填写)
实验用测试数据和相关结果分析:(由学生填写)
实验总结:(由学生填写)
*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
//------图的数组(邻接矩阵)存储表示------------
#define MAX 10000 //最大值
#define N 11 //最大顶点个数
//--------------------景点结构--------------------------------------------------
typedef struct MGraph
{
char *information; //景点名称
int weight; //景点距离; 玲姐矩阵中的权值
char vex[N]; // 顶点向量A-K
int vexnum[N]; //景点数:0-10
}MGraph, AdjMatrix[N][N];
//-------------------OUC图的定义(邻接矩阵)-------------------------------------
static struct MGraph a[N][N], *g;
//-------------- 1. 首先向您展示OUC的地图O(∩_∩)O~~\n"); ----------------------
void DisPlayMGraph()
{
int i,j,k;
//预先直接构造校园的图:邻接矩阵
//MGraph *g;
//printf("test1......\n");
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
if(i==j)
a[i][j].weight=0;
else
a[i][j].weight=MAX;
}
}
//直接构造相互连接的路径
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
a[0][1].weight=1;
a[0][10].weight=10;
a[1][0].weight=1;
a[1][2].weight=2;
a[1][9].weight=8;
a[1][10].weight=9;
a[2][1].weight=2;
a[2][3].weight=3;
a[2][8].weight=5;
a[3][2].weight=3;
a[3][6].weight=6;
a[3][10].weight=10;
a[4][3].weight=4;
a[4][10].weight=10;
a[5][4].weight=5;
a[6][5].weight=6;
a[7][3].weight=5;
a[7][4].weight=6;
a[7][9].weight=7;
a[8][10].weight=10;
a[9][1].weight=8;
a[9][8].weight=7;
a[10][0].weight=10;
a[10][1].weight=9;
a[10][3].weight=10;
a[10][4].weight=10;
a[10][8].weight=10;
}
}
//printf("test 2...\n");
//构造景点的顶点向量
for(i=0; i<11; i++)
{
for(j=0; j<11; j++)
{
a[0][i].vex[i]='A'+i;
}
}
//printf("test 3......\n");
//景点的信息
for(i=0; i<N; i++)
{
a[0][0].information="北区宿舍";
a[0][1].information="康惠达超市";
a[0][2].information="3区教学区 ";
a[0][3].information="九球广场 ";
a[0][4].information="信息学院 ";
a[0][5].information="图书馆 ";
a[0][6].information="南区宿舍 ";
a[0][7].information="西门 ";
a[0][8].information="东区 ";
a[0][9].information="体育馆 ";
a[0][10].information=" 五子顶";
}
//printf("test4.......\n");
for(i=0; i<N; i++)
a[0][i].vexnum[i]=i;
//printf("test5........\n");
printf(" ");
for(i=0; i<N; i++)
printf("%6c", a[0][i].vex[i]);
printf("\n");
for(i=0; i<N; i++)
{
printf("%5c ", a[0][i].vex[i]);
for(j=0; j<N; j++)
{
if(a[i][j].weight==MAX)
printf(" ∞");
else printf(" %5d", a[i][j].weight);
}
printf("\n");
}
printf("\n\n\n||--------------------------------------------------------------||\n\n\n");
printf("|| 以上矩阵对应的边的信息如下: ||\n\n\n");
for(i=0; i<N; i++)
printf("%5c:%s ", a[0][i].vex[i], a[0][i].information);
printf("\n\n\n\n\n");
}
//-----------2. 任意景点相关信息的查询\n");----------------------------------
void QueryAnyViews()
{
printf("\n\n---------------------------------------------------------\n\n");
printf("*****请输入您要查询的景点序号:A~K (输入形式为大写字母 )******\n\n\n");
char choice;
scanf("%c", &choice);
printf("||------------------------------------------------------------------||\n");
switch(choice)
{
case 'A':
printf("|| A 为中国海洋大学北区宿舍公寓,主要为理工科同学 ||\n");
break;
case 'B':
printf("|| B 为康惠达超市,里面为同学们提供各种日常所需用品 ||\n");
break;
case 'C':
printf("|| C 为公共教学区的第3 教学区, 主要是同学们上课自习的场所 ||\n");
break;
case 'D':
printf("|| D 为九球广场 周围是紫藤,开后非常 漂亮 ||\n");
break;
case 'E':
printf("|| E 为信息学院 主要是计算机、物理、海科等专业在里面做实验所用 ||\n");
break;
case 'F':
printf("|| F 为图书馆 里面藏书丰富 平常同学们都是满满的 期末考试时爆满 ||\n");
break;
case 'G':
printf("|| G 为南区宿舍 南区主要就是文管类的同学啦 ||\n");
break;
case 'H':
printf("|| H 为西门校门了 也是海大崂山校区的正门了 特别漂亮 ||\n");
break;
case 'I':
printf("|| I 为东区主要部分, 东区可是美食城啊 ||\n");
break;
case 'J':
printf("|| J 为体育馆 同时也是大学生活动多功能厅 ||\n");
break;
case 'K':
printf("|| K 为五子顶 它在夜景下可是一颗心形的,下面是美丽的樱花大道 ||\n");
break;
default:
break;
}
printf("||------------------------------------------------------------------||\n");
printf("\n\n\n");
}
//---------------3. 任意景点的纹路查询,即查询任意两个景点之间的一条最短的简单路径--------------
//用 Dijkstra算法求原点到所有顶点的最短路径
void SimpleShortestPath()
{
printf("请输入您要查询的任意两个景点的顶点向量:0~10 \n\n\n ");
int u, v;
printf("\n请输入第一个要查询的起点\n");
scanf("%d", &u);
printf("\n请输入第二个要查询的终点\n");
scanf("%d", &v);
MGraph start[N]; //用start[N]数组来存放原点到所有顶点的而最短路径值
//先初始化start[N]数组, 就是 0 号顶点到其余各个顶点的初始路程
int i, j, k, min;
for(i=0; i<N; i++)
start[i].weight=a[0][i].weight;
int book[N]; //book数组来记录最短路畅的顶点集合 book[i]为1表示此顶点在最短路径的集合中, 为0则没有
for(i=0; i<N; i++)
book[i]=0; //book数组初始化
book[1]=1;
//-----------Dijkstra算法核心语句----------------------------
for(i=0; i<N-1; i++)
{
min=MAX;
//找距离 0 号最近的顶点
for(j=0; j<N; j++)
{
if(book[j]==0 && start[j].weight<min)
{
min=start[j].weight;
u=j;
}
}
book[u]=1;
for(v=0; v<N; v++)
{
if(a[u][v].weight < MAX)
{
if(start[v].weight>start[u].weight + a[u][v].weight)
start[v].weight=start[u].weight+a[u][v].weight;
}
}
}
//输出最终结果
for(i=0; i<N; i++)
printf("%5d", start[i].weight);
getchar();
getchar();
getchar();
}
//--------------------------------------------------------------------------
//用 FloydWay算法求原点到所有顶点的最短路径
void FloydWay()
{
//printf("请输入您要查询的任意两个景点的顶点向量:0~10 \n ");
int u, v, w;
//printf("请输入第一个要查询的起点\n");
//scanf("%d", &v);
//printf("请输入第二个要查询的终点\n");
// scanf("%d", &w);
int i;
MGraph g, distance[N][N];
int path[N][N][N];
for(v=0; v<N; v++)
{
for(w=0; w<N; w++)
{
distance[v][w].weight=a[v][w].weight;
for(u=0; u<N; ++u)
{
path[v][w][w]=-1;
if(distance[v][w].weight < MAX)
{
path[v][w][v]=TRUE; //从v 到 w 有直接路径
}
}
}
}
for(u=0; u<N; ++u)
{
for(v=0; v<N; ++v)
{
for(w=0; w<N; ++w)
{
if(distance[v][u].weight+distance[u][w].weight < distance[v][w].weight)
{ //从v到w的一条路径更短
distance[v][w].weight=distance[v][u].weight+distance[u][w].weight;
for(i=0; i<N; i++)
path[v][w][i]= path[v][u][i]||path[u][w][i];
}
// printf("%3c ->%3c", distance[v][w].weight, distance[v][w].weight);
}
}
}
getchar();
getchar();
}
void DisPlayWay()
{
printf("请输入您要查询的任意两个景点的顶点向量:0~10 \n ");
int u, v, w;
printf("请输入第一个要查询的起点\n");
scanf("%d", &v);
printf("请输入第二个要查询的终点\n");
scanf("%d", &w);
//printf("%c---->%c 的最短路径: \n", g.vex[v], g.vex[w]);
printf("*********%5d------>%5d 的最短路径如下:*************\n\n\n", v, w);
printf("*********%5s------->", a[0][v].information);
printf("%5s***********\n\n\n", a[0][w].information);
MGraph p[N][N];
int i, j, k;
for(i=v; i<N; i++)
{
for(j=w; j<N; j++)
{
if(a[i][j].weight < MAX)
{
p[i][j].weight += a[v][w].weight;
// printf("%d", p[i][j].weight);
}
//else
// printf("%d ---> %d 没有最短路径。。。。。\n");
}
//printf("%5s----->", p[i][j].information);
//printf("%s", p[i][j].information);
printf("%d----->", p[i][j].weight);
}
printf("\n\n\n");
}
//---------------------------------主程序界面---------------------------------
int main()
{
printf("******************OUC校园导游*****************\n");
printf("******1.地图如下:******\n\n\n");
printf(" A: 北区宿舍 \n\n\n");
printf(" B:康惠达超市 \n\n");
printf(" J:体育馆 \n\n");
printf("\n\n\n");
printf(" K:五子顶 \n\n");
printf("H:西门 C:3区教学楼 \n\n");
printf(" I:东区 \n\n\n");
printf(" D:九球广场 \n\n");
printf(" E:信息学院 \n\n\n");
printf("\n\n F:图书馆 \n\n\n");
printf("\n\n\n G:南区 \n\n\n");
printf("*********请选择要进行的操作**************\n\n\n");
printf(" 1. 首先向您展示OUC的地图O(∩_∩)O~~\n\n\n");
printf(" 2. 任意景点相关信息的查询\n\n\n");
printf(" 3. 任意景点的纹路查询,应Dijkstra方法求即查询任意两个景点之间的一条最短的简单路径--------------\n\n\n");
printf
(" 4. 用Floyd弗洛伊德方法求一对顶点之间的最短路径\n\n\n");
printf(" 0. 退出。。-------------------------------\n\n\n");
printf("****请输入1 、 2进行选择(直接输入 0 结束 **********\n\n\n");
int choice;
scanf("%d", &choice);
while(choice!=0)
{
switch(choice)
{
case 1:
printf(" 1. 首先向您展示OUC的地图O(∩_∩)O~~\n\n");
DisPlayMGraph();
break;
case 2:
printf(" 2.现在您会看到ouc景点的简要介绍\n\n");
QueryAnyViews();
break;
case 3:
printf(" 3.从北区宿舍楼到其他各个顶点的最短路径距离\n\n");
SimpleShortestPath();
break;
case 4:
printf("任意两个顶点之间的最短路径\n\n\n");
FloydWay();
DisPlayWay();
break;
default:
break;
}
printf("********请输入1 、 2、 3、 4 进行选择(直接输入 0 结束 **********\n\n\n");
scanf("%d", &choice);
}
system("pause");
return 0;
}
运行效果如下:




希望大神指正~~~
OUC校园导游的更多相关文章
- 校园导游系统(C++实现,VC6.0编译,使用EasyX图形库)
运行效果: 说明: 由于当年还不会使用多线程,所以很多获取用户点击的地方都是使用循环实现的...CPU占用率会比较高. 代码: //校园导游系统.cpp 1 #include <graphics ...
- 校园导游之NABC个人分析
校园导游之NABC个人分析 Need: 为不熟悉校园环境的人们(如新生,来咱们学校参观滴)提供便利. Approach: 了解Andriod应用开发:导航功能之外还可以对学校进行宣传,比如拍一些学校的 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 開始Unity3D的学习之旅
前言:这个系列的文章纯属对自己学习的整理,非高手之作.但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程.争取每周整理一次吧.之所以会開始学Unity3D,最基本的原因是由于在快放暑假的时 ...
- 开始Unity3D参观考察
前言:这个系列的文章纯属对自己学习的整理,非高手之作. 但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程.争取每周整理一次吧. 之所以会開始学Unity3D,最基本的原因是由于在快放暑假 ...
- 《NULL-2019团队》第一次作业:OUC二手交易平台
前言 项目名称:OUC二手交易平台 项目简介:针对在校大学生的二手交易平台,相对于现在市面已有的二手APP,将其使用的普遍性范围缩小,针对在校大学生,这样可以有效的保证交易的真实性和公平性. NA ...
- 首师大附中互测题:LJX的校园:入学典礼【C003】
[C003]LJX的校园:入学典礼[难度C]—————————————————————————————————————————————————————————————————————————————— ...
- 首师大附中科创教育平台 我的刷题记录 3120 LJX的校园:入学典礼
今天给大家献上"C"级题:LJX的校园:入学典礼!! 试题编号:3120 LJX的校园:入学典礼 难度级别:C: 运行时间限制:45ms: 运行空间限制:256000K ...
- LR12.53—使用HP网络导游示例应用程序
本教程使用 的HP Web之旅,一个样本的基于Web的旅行社系统,向人们展示LoadRunner将如何作为负载测试解决方案.惠普网络旅游用户连接到Web服务器,搜索航班,预订机票,检查飞行路线. 虽然 ...
随机推荐
- 马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版
时隔一年多,终于朋友的忽悠下吧抢票Demo的最后一步完善了,与2014年1月9日成功生成车票. Demo仅经过自己测试,并未在高峰期进行测试,代码质量很差,因为赶工,套用去年模板并未使用设计模式. 代 ...
- 种子填充算法描述及C++代码实现
项目需要看了种子填充算法,改进了算法主要去除面积小的部分.种子填充算法分为两种,简单的和基于扫描线的方法,简单的算法如下描述(笔者针对的是二值图像): (1)从上到下,从左到有,依次扫描每个像素: ( ...
- 51nod 简单的动态规划
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- hibernate通过xml配置文件实现表与实体的映射
这里讨论的是一对多的关系 在做公交卡系统,会涉及到两张表,忽略两种表的作用,只关心他们之间的关系 : 卡规格表和卡类表,一种卡规格会对应多个卡类 实体类: /** * 卡类型表的实体 */ publi ...
- pyhton 学习
官方学习文档 https://docs.python.org/3/tutorial/
- Spring+EhCache缓存实例
一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...
- VS2010出现FileTracker : error FTK1011编译错误的解决办法
VS2010出现FileTracker : error FTK1011不知道是不是vs2010的一个bug,反正有人提交了. FileTracker : error FTK1011编译错误的解决办法有 ...
- bzoj2555: SubString
SAM+LCT维护parent tree版本 虽然说子树维护那套理论需要ETT 不过parent tree的根是固定的,所以用lct加一些奇怪的乱搞就行了 //随手拖个SAM的板子和LCT的板子,然后 ...
- 重写保存按钮save事件
_saveActionEventHandler:function(event,value){ if (!_self.fireEvent("saveBefore")) return; ...
- Java程序员
从生存.制胜.发展三个方面入手,为大家展示出程序员求职与工作的一幅3D全景图像.本书中既有在公司中的生存技巧,又有高手达人的进阶策略,既有求职攻略的按图索骥,又有入职后生产环境的破解揭秘. 书中浓缩了 ...