试题描述:要求系统中记录了校园中的教学楼、图书馆、食堂、田径场、篮球场、超市、医务室等坐标信息和连接这些坐标的路径信息,每条路径包含两个坐标间的距离和预计消耗的卡路里,能进行坐标点的增加和删除,能够满足不同用户的查询,如:两坐标之间的最高卡路里路线和最短距离路线。要求有运行结果截图。
写的复杂了点,但时间紧迫,懒得优化了,以后有空重写下。
#include <bits/stdc++.h>
using namespace std;
int num = 7, Maxn = 0xfff, Minn = -0xfff;
struct node {
int Distance;
int Calorie;
};
struct location {
string name;
int Known = 0;
int Dist = Maxn;
int Calo = Minn;
int path = -1;
};
struct node Graph[100][100];
struct location Adress[100];
string School[100] = {"教学楼", "图书馆", "食堂", "田径场", "篮球场", "超市", "医务室"};
void InitGraph() {
srand((int)time(NULL));
int Dist1,Dist2;
for (int i = 0; i < num ; ++i) {
for (int j = i; j < num; ++j) {
if (i == j) {
Graph[i][j].Distance = Maxn;
Graph[i][j].Calorie = 0;
continue;
}
Dist1=rand()%100;
Dist2=rand()%100;
Graph[i][j].Distance = Dist1;
Graph[i][j].Calorie = Dist2;
Graph[j][i].Distance = Dist1;
Graph[j][i].Calorie = Dist2;
}
Adress[i].name = School[i];
}
cout << "地图初始化完成!" << endl;
}
void InitAgain(){
for(int i=0;i<num;i++){
Adress[i].Known=0;
Adress[i].path=-1;
Adress[i].Dist=Maxn;
Adress[i].Calo=Minn;
Adress[i].name=School[i];
}
}
void Dist_Dijkstra(string start, string end) {
int loc_end, loc_start, Maxn;
for (int i = 0; i < num; ++i) {
if (School[i] == end) loc_end = i;
if (School[i] == start) loc_start = i;
}
int Tloc, MinLoc = Maxn;
for (int i = 0; i < num; i++) {
if (i == loc_start) continue;
Adress[i].path = loc_start;
Adress[i].Dist = Graph[loc_start][i].Distance;
}
Adress[loc_start].Known = 1;
while (1) {
Minn=0xfff;
for (int i = 0; i < num; i++) {
if (Adress[i].Known == 1) continue;
if (Adress[i].Dist < Minn) {
Tloc = i;
Minn = Adress[i].Dist;
}
}
if (Tloc == loc_end) break;
if (Adress[Tloc].path == -1) break;
Adress[Tloc].Known = 1;
for (int i = 0; i < num; ++i) {
if (Adress[i].Known == 1 || i == Tloc) continue;
if (Adress[Tloc].Dist + Graph[Tloc][i].Distance < Adress[i].Dist) {
Adress[i].Dist = Adress[Tloc].Dist + Graph[Tloc][i].Distance;
Adress[i].path = Tloc;
}
}
}
}
void Calo_Dijkstra(string start, string end) {
int loc_end, loc_start, Maxn;
for (int i = 0; i < num; ++i) {
if (School[i] == end) loc_end = i;
if (School[i] == start) loc_start = i;
}
int Tloc, MinLoc = Maxn;
for (int i = 0; i < num; i++) {
if (i == loc_start) continue;
Adress[i].path = loc_start;
Adress[i].Calo = Graph[loc_start][i].Calorie;
}
Adress[loc_start].Known = 1;
while (1) {
Maxn=-0xfff;
for (int i = 0; i < num; i++) {
if (Adress[i].Known == 1) continue;
if (Adress[i].Calo > Maxn) {
Tloc = i;
Maxn = Adress[i].Calo;
}
}
if (Tloc == loc_end) break;
if (Adress[Tloc].path == -1) break;
Adress[Tloc].Known = 1;
for (int i = 0; i < num; ++i) {
if (Adress[i].Known == 1 || i == Tloc) continue;
if (Adress[Tloc].Calo + Graph[Tloc][i].Calorie > Adress[i].Calo) {
Adress[i].Calo = Adress[Tloc].Calo + Graph[Tloc][i].Calorie;
Adress[i].path = Tloc;
}
}
}
}
void PrintPath(int end) {
if (Adress[end].path != -1) {
PrintPath(Adress[end].path);
cout << " to ";
}
cout << Adress[end].name;
}
int main(int argc, char const *argv[]) {
char c='y';
string start,end;
int dis,cal;
InitGraph();
while(c=='y'){
system("cls");
cout<<"请输入操作:"<<endl;
cout<<" a:增加地点"<<endl;
cout<<" d:删除地点"<<endl;
cout<<" h:最高卡路里查询"<<endl;
cout<<" l:最短距离查询"<<endl;
cin>>c;
switch (c){
int tmp;
case 'l':
cout<<"请输入起始地点:";
cin>>start;
cout<<"请输入目标地点:";
cin>>end;
Dist_Dijkstra(start,end);
for (int i = 0; i < num; ++i)
if (School[i] == end){
tmp = i;
break;
}
PrintPath(tmp);
cout<<endl;
InitAgain();
break;
case 'h':
cout<<"请输入起始地点:";
cin>>start;
cout<<"请输入目标地点:";
cin>>end;
Calo_Dijkstra(start,end);
for (int i = 0; i < num; ++i)
if (School[i] == end){
tmp = i;
break;
}
PrintPath(tmp);
cout<<endl;
InitAgain();
break;
case 'a':
cout<<"请输入增加的地点名称:";
cin>>start;
School[num]=start;
for(int i=0;i<num-1;i++){
cout<<"请输入"<<start<<"到"<<School[i]<<"的距离和卡路里消耗(空格分隔):";
cin>>dis>>cal;
Graph[i][num].Distance=dis;
Graph[i][num].Calorie=cal;
Graph[num][i].Distance=dis;
Graph[num][i].Calorie=cal;
}
num++;
InitAgain();
break;
case 'd':
cout<<"请输入删除的地点名称:";
cin>>end;
for (int i = 0; i < num; ++i)
if (School[i] == end){
tmp = i;
break;
}
for(int i=tmp;i<num-1;i++){
School[i]=School[i+1];
}
cout<<"删除成功!"<<endl;
num--;
InitAgain();
break;
default:
cout<<"无该操作!"<<endl;
}
cout<<"继续或退出(y/任意键):";
cin>>c;
}
return 0;
}