校园导航
校园导航问题@
【问题描述】
以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。
【需求分析】
设计学校的平面图,至少包括10个以上景点(场所),每两个景点间可以有不同道路,且路长也可能不同,找出在游人所在景点到其他景点的最短路径,或游人输入的任意两个景点的最短路径。 要求: (1) 以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,路径权重为路径长度。 (2) 为游人提供任意景点相关信息查询。 (3)为游人提供任意景点的问路查询,即任意两个景点之间的最短路径。
实现提示: 一般情况下,校园道路是双向通行的,可设计校园平面图是一个无向图。顶点和边均含有相关信息。 选做内容: (1)提供图的编辑功能:增删景点;增删道路;修改已有信息等。 (2)校园导游图的仿真界面。
我的代码:
#include<bits/stdc++.h>
#include <iostream>
#include <string>
#include <stack>
#include <windows.h>
#include<iomanip>
#define MAXNUM 100 //最大景点数量
#define INF 1e6 //路径最大长度,表示此路不通
//管理员账号 hbu
//管理员密码 123456
using namespace std;
void delay();//延迟
void init ();//初始化
void campus_maps();//地图全貌
int find_node(string name);//找位置
void Dijkstra (int start,int end);//Dijkstra 求最短路径,并打印出来
void Visiter();//游客系统
void Administrator();//管理员系统
void add_Info();//增加景点
void delete_Info();//删除景点
void add_path();//增加道路
void delete_path();//删除道路
int path[MAXNUM][MAXNUM]; //保存下一个结点
int short_path[MAXNUM][MAXNUM]; //最短路径的长度
struct building
{
string name; //建筑名称
int code;//代号
string information;//建筑信息
};
int building_number = 31;
struct building ve[MAXNUM];
//---------------邻接矩阵存储顶点和边
int weight[MAXNUM][MAXNUM] = {{0}}; //权重就是长度
//-----------延迟----
void delay()
{
for(long long i = 0; i < 1e9; i++);
}
void init ()
{
//-------------数组存储相关信息
ve[0] = {"校医院", 0, " "};
ve[1] = {"生科院", 1, " "};
ve[2] = {"逸夫楼", 2, " "};
ve[3] = {"理化中心", 3, " "};
ve[4] = {"建工学院", 4, " "};
ve[5] = {"宿舍梅园3、4、5号", 5, " "};
ve[6] = {"宿舍梅园6号", 6, " "};
ve[7] = {"宿舍梅园2号", 7, " "};
ve[8] = {"宿舍梅园1号", 8, " "};
ve[9] = {"操场", 9, " "};
ve[10] = {"篮球场 网球场", 10, " "};
ve[11] = {"北院餐厅", 11, " "};
ve[12] = {"化学学院", 12, " "};
ve[13] = {"电信学院", 13, " "};
ve[14] = {"物理学院", 14, " "};
ve[15] = {"竞学楼", 15, " "};
ve[16] = {"南1门", 16, " "};
ve[17] = {"南2门", 17, " "};
ve[18] = {"北1门", 18, " "};
ve[19] = {"北2门", 19, " "};
ve[20] = {"文苑楼", 20, " "};
ve[21] = {"图书馆", 21, " 河北大学图书馆现位于保定市河北大学新校区内,原河北大学图书馆——北疆博物馆始建于1921年,是法国天主教会在天津创办的工商大学附设的图书馆。建筑面积32846平方米,馆藏图书390万余册,是国务院批准文化部确定的全国古籍重点保护单位之一。在经济全球化、社会知识化、信息数字化的时代,信息资源无穷的穿透力,已经成为现代大学教学科研的核心支撑力。对于一所高等院校来说,没有高效完备的现代化图书馆和图书情报信息服务,就不可能建成名副其实、和谐发展的现代化大学,随着河北大学的快速发展,河北大学图书馆正朝着研究型、高层位的现代化图书馆目标迈进。"};
ve[22] = {"南苑餐厅", 22, " "};
ve[23] = {"第七教学楼", 23, " "};
ve[24] = {"多功能厅", 24, " "};
ve[25] = {"主楼", 25, " "};
ve[26] = {"第九教学楼", 26, " "};
ve[27] = {"第八教学楼", 27, " "};
ve[28] = {"综合教学楼", 28, " "};
ve[29] = {"国际交流学院", 29, " "};
ve[30] = {"敏秀园", 30, " "};
//----权重表示长度 邻接矩阵存储
weight[0][1]=weight[1][0] = 82;
weight[1][2]=weight[2][1] = 92;
weight[1][4]=weight[4][1] = 111;
weight[2][17]=weight[2][17] = 93;
weight[2][3]=weight[3][2] = 105;
weight[2][12]=weight[12][2] = 178;
weight[3][4] =weight[4][3]= 80;
weight[4][11]=weight[11][4] = 84;
weight[4][12]=weight[12][4] = 91;
weight[5][11]=weight[11][5] = 44;
weight[5][6] =weight[6][5]= 92;
weight[5][10]=weight[10][5] = 49;
weight[11][12]=weight[12][11] = 114;
weight[11][10]=weight[10][11] = 25;
weight[11][13]=weight[13][11] = 102;
weight[10][6] =weight[6][10]= 20;
weight[10][13]=weight[13][10] = 15;
weight[10][9] =weight[9][10]= 5;
weight[6][7] =weight[7][6]= 20;
weight[7][9] =weight[9][7]= 10;
weight[7][8] =weight[8][7]= 134;
weight[9][8]=weight[8][9] = 10;
weight[9][13]=weight[13][9] = 70;
weight[12][13]=weight[13][12] = 108;
weight[12][14]=weight[14][12] = 57;
weight[13][15]=weight[15][13] = 115;
weight[14][15]=weight[15][14] = 53;
weight[14][17]=weight[17][14] = 179;
weight[14][16]=weight[16][14] = 59;
weight[15][16]=weight[16][15] = 56;
weight[16][17]=weight[17][16] = 202;
weight[16][19]=weight[19][16] = 39;
weight[17][18]=weight[18][17] = 37;
weight[18][19]=weight[19][18] = 210;
weight[18][20]=weight[20][18] = 60;
weight[18][21]=weight[21][18] = 134;
weight[19][21]=weight[21][19] = 77;
weight[19][24]=weight[24][19] = 96;
weight[19][25]=weight[25][19] = 114;
weight[20][22]=weight[22][20] = 93;
weight[20][27]=weight[27][20] = 44;
weight[22][23]=weight[23][22] = 150;
weight[22][27]=weight[27][22] = 75;
weight[22][28]=weight[28][22] = 110;
weight[23][28]=weight[28][23] = 144;
weight[28][27]=weight[27][28] = 42;
weight[27][26]=weight[26][27] = 87;
weight[28][26]=weight[26][28] = 73;
weight[28][29]=weight[29][28] = 169;
weight[26][21]=weight[21][26] = 78;
weight[26][29]=weight[29][26] = 167;
weight[26][30]=weight[30][26] = 20;
weight[26][25]=weight[25][26] = 190;
weight[30][29]=weight[29][30] = 139;
weight[30][25]=weight[25][30] = 20;
weight[25][24]=weight[24][25] = 91;
}
//--------------打印地图
void campus_maps()
{
int count=0;
printf(" ==========================================================================\n");
cout << "|| *** 河北大学所有景点*** ||"<< endl;
cout << "|| ||"<< endl;
cout <<"||";
for(int i=0; i<building_number; i++)
{
printf("%2d、",ve[i].code);
cout <<setiosflags(ios::left)<<setw(20)<< ve[i].name;
count++;
if(count==3)
{
cout <<"||"<< endl;
count=0;
cout <<"||";
}
}
cout << endl;
printf(" ==========================================================================\n");
}
//---------查询模式--打印相关点的信息
int find_node(string name)
{
for(int i = 0; i < building_number; i++)
{
if(ve[i].name == name)
{
return i; //找到了,返回相对应的位置
break;
}
}
return -1;//没有找到返回-1
}
//问路模式------Dijkstra 求最短路径,并打印出来
void Dijkstra (int start, int end)
{
int dis[building_number];
int path[building_number];
for(int i = 0; i < building_number; i++) //初始化dis path
{
if(start != i && weight[start][i] == 0)
dis[i] = INF;
else if(weight[start][i] != 0)
dis[i] = weight[start][i];
else if(start == i)
dis[i] = 0;
path[i] = -1;
}
bool visited[building_number] = {false};
// int s=start;
visited[start] = true;
while(1)
{
int j;
bool flag = false;
for(j = 0; j < building_number; j++)
{
if(visited[j] == false)
{
flag = true;
break;
}
}
int min = j;
if(flag == false)
break;
for(int i = 0; i < building_number; i++)
{
if(visited[i] == false)
if(dis[min] > dis[i])
min = i;
}
visited[min] = true; //收录的条件就是dis里面最小的
for(int i = 0; i < building_number; i++)
{
if(weight[min][i] != 0 && visited[i] == false) //i是min的邻接点
if(dis[i] > dis[min] + weight[min][i])
{
dis[i] = dis[min] + weight[min][i];
//暂时的,还不能收入,不确定是不是dist最小的,或者不确定后面有没有更小的
path[i] = min; //暂时的
}
}
}
if(dis[end]==INF)
cout << "从" << ve[start].name << "->" << ve[end].name<<"不通"<< endl;
else
{
cout << "从" << ve[start].name << "->" << ve[end].name << "的最短路径为: " << dis[end] << "km\n"<< "路径为:";
int n = end;
stack<int> st;
st.push(end);
while(path[n] != -1)
{
st.push(path[n]);
n = path[n];
}
st.push(start);
cout << ve[st.top()].name;
st.pop();
while (!st.empty())
{
cout << "->" << ve[st.top()].name;
st.pop();
}
cout << endl;
}
}
//-------游客系统
void Visiter()
{
campus_maps();
int a = 1;
char ch;
while(a == 1)
{
printf(" ================================================================ \n");
printf("|| 卍 欢迎来到河北大学校园导航系统卍 ||\n");
printf("|| ||\n");
printf("|| ***游客系统*** ||\n");
printf("|| ||\n");
printf("|| <1>查询任意景点 ||\n");
printf("|| <2>问路查询 ||\n");
printf("|| <3>退出系统 ||\n");
printf("|| ||\n");
printf(" ================================================================ \n");
printf("请输入您的指令: ");
cin >> ch;
if(ch != '1' && ch != '2' && ch != '3')
{
cout << "输入错误,请重新输入" << endl;
cin >> ch;
}
//------查询模式
while(ch == '1')
{
string find_name;
cout << "你想要查:";
cin >> find_name;
int i = find_node(find_name);
while(i == -1)
{
cout << "无此信息,请重新输入" ;
cin >> find_name;
i = find_node(find_name);
}
cout << "所查信息为:" << ve[i].name << endl;
cout << "简介:" << ve[i].information << endl;
delay();
break;
}
//----问路模式
while(ch == '2')
{
string start_name;
cout << "输入起点:";
cin >> start_name;
int i = find_node(start_name);
while(i == -1)
{
cout << "无此信息,请重新输入" << endl;
cin >> start_name;
i = find_node(start_name);
}
string end_name;
cout << "输入终点:";
cin >> end_name;
int j = find_node(end_name);
while(j == -1)
{
cout << "无此信息,请重新输入" << endl;
cin >> end_name;
j = find_node(end_name);
}
Dijkstra(i, j);
delay();
break;
}
while(ch == '3')
{
cout << "谢谢,再见!" << endl;
a=0;
break;
exit(0);
}
}
}
//--------管理员系统
void Administrator()
{
int a = 1;
char ch;
campus_maps();
while(a == 1)
{
printf(" ================================================================ \n");
printf("|| 卍 欢迎来到河北大学校园导航系统 卍 ||\n");
printf("|| ||\n");
printf("|| ***管理员系统*** ||\n");
printf("|| ||\n");
printf("|| <1>查询任意景点 ||\n");
printf("|| <2>问路查询 ||\n");
printf("|| <3>增加景点 ||\n");
printf("|| <4>删除景点 ||\n");
printf("|| <5>增加道路 ||\n");
printf("|| <6>删除道路 ||\n");
printf("|| <7>退出系统 ||\n");
printf("|| ||\n");
printf(" ================================================================ \n");
printf("请输入您的指令: ");
cin >> ch;
if(ch != '1' && ch != '2' && ch != '3'&&ch!='4'&&ch!='5'&&ch!='6'&&ch!='7')
{
cout << "输入错误,请重新输入" << endl;
cin >> ch;
}
//------查询模式
while(ch == '1')
{
string find_name;
cout << "你想要查:";
cin >> find_name;
int i = find_node(find_name);
while(i == -1)
{
cout << "无此信息,请重新输入" ;
cin >> find_name;
i = find_node(find_name);
}
cout << "所查信息为:" << ve[i].name << endl;
cout << "简介:" << ve[i].information << endl;
delay();
break;
}
//----问路模式
while(ch == '2')
{
string start_name;
cout << "输入起点:";
cin >> start_name;
int i = find_node(start_name);
string end_name;
cout << "输入终点:";
cin >> end_name;
int j = find_node(end_name);
while(i == -1||j==-1)
{
cout << "无此信息,请重新输入" << endl;
cout << "输入起点:";
cin >> start_name;
i=find_node(start_name);
cout << "输入终点:";
cin >> end_name;
j=find_node(end_name);
}
Dijkstra(i, j);
delay();
break;
}
while(ch == '3')
{
add_Info();
break;
}
while(ch == '4')
{
delete_Info();
break;
}
while(ch == '5')
{
add_path();
break;
}
while(ch == '6')
{
delete_path();
break;
}
while(ch == '7')
{
cout << "谢谢,再见!" << endl;
a=0;
exit(0);
break;
}
}
}
/*
//-----------问路模式---实现指定点到所有点的最短路径
void short_path_floyd(int weight[][MAXNUM], int path[][MAXNUM], int short_path[][MAXNUM])
{
for (int i = 0; i < building_number; i++)//初始化 path_matrix 和 short_path_table
{
for (int j = 0; j < building_number; j++)
{
short_path[i][j] = weight[i][j];
path[i][j] = j;
}
}
for (int i = 0; i < building_number; i++)
{
for (int j = 0; j < building_number; j++)
{
for (int k = 0; k< building_number; k++)
{
if (short_path[j][k] > short_path[j][i] + short_path[i][k])
{
short_path[j][k] = short_path[j][i] + short_path[i][k];
path[j][k] = path[j][i];
}
}
}
}
}
*/
//-------增加景点
void add_Info()
{
struct building info;
string add_name;
cout << "请输入增加的景点名称:" ;
cin >> add_name;
int i=find_node(add_name);
while(i!=-1)
{
cout << "该景点已存在,请重新输入"<< endl;
cout << "请输入增加景点名称:";
cin >> add_name;
i=find_node(add_name);
}
string brief;
cout << "请输入景点信息简介:";
cin >> brief;
info.code = building_number ;
info.name = add_name;
info.information = brief;
ve[building_number]=info;
building_number++;
cout << "景点添加成功!" << endl;
campus_maps();
}
void delete_Info()
{
string info_name;
cout << "请输入您要删除的景点:";
cin >> info_name;
int i = find_node(info_name);
while(i == -1)
{
cout << "无此信息,请重新输入" << endl;
cin >> info_name;
i = find_node(info_name);
}
cout << "您要删除的景点名称:" << ve[i].name << endl;
cout << "是否确认删除?确认输入1" << endl;
char ch;
cin >> ch;
if(ch == '1')
{
cout << "正在删除景点...." << endl;
for(int k=i; k<building_number-1; k++)
{
ve[k].name=ve[k+1].name;
ve[k].information=ve[k+1].information;
}
int m,n;
for(int m=i; m<building_number-1; m++)
{
for(int n=0; n<building_number; n++)
{
weight[m][n]=weight[m+1][n];
}
}
building_number--;
cout << "景点删除成功" << endl;
campus_maps();
}
}
void add_path()
{
cout << "请输入要增加道路的两个景点:" << endl;
string name1, name2;
cin >> name1 >> name2;
int i = find_node(name1);
int j = find_node(name2);
while(i == -1 || j == -1)
{
cout << "两个景点名称有错误,请重新输入" ;
cin >> name1 >> name2;
}
int distance;
cout << "请输入" << name1 << "与" << name2 << "之间道路的长度:";
cin >> distance;
cout << "正在添加道路......" << endl;
weight[i][j] = distance;
weight[j][i] = distance;
cout << "道路添加成功" << endl;
}
void delete_path()
{
cout << "请输入要删除道路的两个景点:" << endl;
string name1, name2;
cin >> name1 >> name2;
int i = find_node(name1);
int j = find_node(name2);
while(i == -1 || j == -1)
{
cout << "两个景点名称有错误,请重新输入" ;
cin >> name1 >> name2;
}
cout << "您要删除的是" << name1 << "与" << name2 << "之间的道路,是否确认删除这条道路?" << endl;
cout << "确认请输入1" << endl;
char ch;
cin >> ch;
if(ch == '1')
{
cout << "正在删除道路" << endl;
weight[i][j] = 0;
weight[j][i] = 0;
delay();
cout << "道路删除成功" << endl;
}
}
int main()
{
init(); //初始化,存储相关数据
char mode;
int a = 1;
while(a == 1)
{
printf(" ================================================================ \n");
printf("|| 卍 欢迎来到河北大学校园导航系统卍 ||\n");
printf("|| ||\n");
printf("|| ||\n");
printf("|| <1>游客登录 ||\n");
printf("|| <2>管理员登录 ||\n");
printf("|| <3>退出系统 ||\n");
printf("|| ||\n");
printf(" ================================================================ \n");
printf("请输入您的指令: ");
cin >> mode;
while(mode != '1' && mode != '2' && mode != '3')
{
cout << "输入有误,请重新输入!" << endl;
cin >> mode;
}
//--------游客登录界面
while(mode == '1')
{
system("cls");
Visiter();
exit(0);
}
while(mode == '2')
{
cout << "请输入账号:";
string account;
string password;
cin >> account;
cout << "请输入密码:";
cin >> password;
while(account != "hbu" && password != "123456")
{
cout << "账号或密码错误!请重新输入" << endl;
cout << "请输入账号:";
cin >> account;
cout << "请输入密码:";
cin >> password;
}
cout << "\t\t\t登录成功......" << endl;
delay();
Administrator();
exit(0);
a=0;
}
while(mode == '3')
{
cout << "谢谢,再见!" << endl;
a = 0;
exit(0);
}
}
}