题目:
23.校园路线导游系统
1.问题描述
用无向网表示东莞理工学院的校园景点平面图,图中顶点表示主要景点(要求包
含学校的大部分景点信息,包括教学楼,体育馆,食堂,学生宿舍,图书馆等信息),
存放景点的编号、名称、简介等信息,图中的边表示景点间的道路(可以用导航
测出具体距离),存放路径长度等信息。要求能够回答有关景点介绍、游览路径
等问题。
2.基本要求
(1) 查询各景点的相关信息;
(2) 查询图中任意两个景点间的最短路径。
(3) 查询图中任意两个景点间的所有路径。
(4) 增加、删除、更新有关景点和道路的信息。
(5) 设计一个菜单,上述操作要求都作为菜单中的主要菜单项。
3.选作内容
(1) 求多个景点的最佳(最短)游览路径。
(2) 区分机动车道和人行道。
(3) 实现导游图的仿真界面。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define INF 32767
int visited[100],password; //password为后台管理的登录密码
FILE *fp;
char na[100];
char str1[100],str3[100];
int N,M;
int a[100][100];
using namespace std;
typedef struct
{
int num;
char name[100];
char introduction[100];
} VertexType;
typedef struct
{
int edges[100][100];
int n,e;
VertexType vex[100];
} MGraph;
typedef struct ANode
{
int adjvex;
struct ANode *nextarc;
} ArcNode;
typedef struct Vnode
{
ArcNode *firstarc;
} VNode;
typedef VNode AdjList[100];
typedef struct
{
AdjList adjlist;
int n,e;
} ALGraph;
MGraph g;
//将文本文件打开并输出文件中的内容
void ReadData1(MGraph &g)
{
M=N;
FILE *fp;
int i = 0,j;
if ((fp=fopen("path.txt", "r"))==NULL)
{
printf("error open!");
exit(0);
}
for(i=0; i<M; i++)
{
for(j=0; j<M; j++)
{
fscanf(fp,"%d",&g.edges[i][j]);
}
}
fclose(fp);
}
void WriteData1(MGraph &g)
{
FILE *fp;
int i = 0,j;
if ((fp=fopen("path.txt", "w"))==NULL)
{
printf("error open!");
exit(0);
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
printf("%d ",g.edges[i][j]);
fprintf(fp,"%d ",g.edges[i][j]);
}
printf("\n");
}
fclose(fp);
}
void ReadData(MGraph &g)
{
FILE *fp;
int i = 0;
if ((fp=fopen("data.txt", "r"))==NULL)
{
printf("error open!");
exit(0);
}
while(fscanf(fp,"%d %s %s",&g.vex[i].num,g.vex[i].name,g.vex[i].introduction)!= EOF)
{
i++;
}
N = i;
fclose(fp);
return;
}
void WriteData(MGraph &g)
{
FILE *fp;
int i=0;
if ((fp=fopen("data.txt", "w"))==NULL)
{
printf("error open!");
exit(0);
}
for(i=0; i<N; i++)
fprintf(fp,"%d %s %s\n",g.vex[i].num,g.vex[i].name,g.vex[i].introduction);
fclose(fp);
}
//将邻接矩阵改为邻接表
void MatToList(MGraph g,ALGraph *&G)
{
int i,j;
ArcNode *p;
G=(ALGraph *)malloc(sizeof(ALGraph));
for(i=0; i<g.n; i++)
G->adjlist[i].firstarc=NULL;
for(i=0; i<g.n; i++)
for(j=g.n-1; j>=0; j--)
{
if(g.edges[i][j]!=INF)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
}
G->n=g.n;
G->e=g.e;
}
//查找相应景点的介绍
void FindIntroduction(MGraph &g)
{
int x,d;
while(1)
{
printf("请输入要查询的景点的编号:");
scanf("%d",&x);
ReadData(g);
printf("景点的名称:%s\n",g.vex[x].name);
printf("景点的简介:");
printf("%s\n",g.vex[x].introduction);
printf("是否要继续查询(0.继续 1.不继续):");
scanf("%d",&d);
while(1)
{
if(d==0||d==1)
break;
else
{
printf("输入的数据不合理,请重新输入:");
scanf("%d",&d);
}
}
if(d==0)
continue;
else
break;
}
}
//输出两个顶点间的最短路径
void Dispath(MGraph &g,int A[][100],int path[][100])
{
int i,j,k,s,u,v;
printf("请输入你所在位置的编号:");
scanf("%d",&u);
printf("请输入你要去位置的编号:");
scanf("%d",&v);
int apath[100],d;
for(i=0; i<g.n; i++)
{
for(j=0; j<g.n; j++)
{
if(A[i][j]!=INF&&i!=j&&u==i&&v==j)
{
printf(" 从%s到%s的最短路径为:",g.vex[i].name,g.vex[j].name);
k=path[i][j];
d=0;
apath[d]=j;
while(k!=-1&&k!=i)
{
d++;
apath[d]=k;
k=path[i][k];
}
d++;
apath[d]=i;
printf("%s",g.vex[apath[d]].name);