You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Urban_subway_navigation_system/代码123.cpp

352 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ALLNameNum 99
#define INF 99999
typedef int dist[ALLNameNum];
typedef int path[ALLNameNum];
typedef struct
{
char name[100];
char intro[999];
int x, y;
}SITE;
typedef struct
{
SITE site[ALLNameNum];
int length[ALLNameNum][ALLNameNum];
}MAP;
MAP M;
int N = 0;
path p;
dist d;
void init()
{
int i, j;
strcpy(M.site[1].name, "苹果园");
strcpy(M.site[1].intro, "北京市石景山区,位于苹果园南路");
strcpy(M.site[2].name, "古城");
strcpy(M.site[2].intro, "位于北京市石景山区石景山路与古城小街交会东侧");
strcpy(M.site[3].name, "八角游乐园");
strcpy(M.site[3].intro, "石景山区八角立交桥东侧");
strcpy(M.site[4].name, "公主坟");
strcpy(M.site[4].intro, "北京市海淀区复兴路和西三环中路交会处下方");
strcpy(M.site[5].name, "复兴门");
strcpy(M.site[5].intro, "位于北京市西城区复兴门外大街、复兴门内大街、复兴门南大街、复兴门北大街交汇处");
strcpy(M.site[6].name, "天安门西");
strcpy(M.site[6].intro, "位于中国北京市西城区西长安街和南长街交会处是北京地铁运营有限公司运营管理的车站也是北京地铁1号线的中间站");
strcpy(M.site[7].name, "建国门");
strcpy(M.site[7].intro, "位于中国北京市东城区与朝阳区交界处建国门桥下方是北京地铁运营有限公司运营的车站也是北京地铁1号线、北京地铁2号线的换乘站");
strcpy(M.site[8].name, "永安门");
strcpy(M.site[8].intro, "位于中国北京市朝阳区建国门外大街与东大桥路交叉口的下方");
strcpy(M.site[9].name, "鼓楼大街");
strcpy(M.site[9].intro, "是北京地铁2号线与北京地铁8号线的换乘站,位于北京市西城区与东城区交界处,安定门西大街-德胜门东大街与旧鼓楼大街-旧鼓楼外大街交会处");
strcpy(M.site[10].name, "雍和宫");
strcpy(M.site[10].intro, "位于北京市东城区北二环安定门东大街与雍和宫大街、和平里西街交汇处");
strcpy(M.site[11].name, "朝阳门");
strcpy(M.site[11].intro, "位于北京市东城区与朝阳区交界处,朝阳门外大街-朝阳门内大街与朝阳门南大街-朝阳门北大街交汇处");
strcpy(M.site[12].name, "北京站");
strcpy(M.site[12].intro, "位于中国北京市东城区境内、北京站北广场下方");
strcpy(M.site[13].name, "崇文门");
strcpy(M.site[13].intro, "北京地铁2号线和北京地铁5号线在此交汇位于北京市东城区前门东大街与崇文门内大街交汇口");
strcpy(M.site[14].name, "和平门");
strcpy(M.site[14].intro, "位于北京市西城区北新华街-南新华街与前门西大街-宣武门东大街交汇处");
strcpy(M.site[15].name, "宣武门");
strcpy(M.site[15].intro, "位于中国北京市西城区是北京地铁2号线和北京地铁4号线的换乘站");
strcpy(M.site[16].name, "长椿街");
strcpy(M.site[16].intro, "长椿街站是北京地铁2号线的一个车站,位于北京市西城区宣武门西大街、长椿街交汇处");
strcpy(M.site[17].name, "西直门");
strcpy(M.site[17].intro, "位于北京市西城区西直门桥下方");
strcpy(M.site[18].name, "圆明园");
strcpy(M.site[18].intro, "位于北京市海淀区清华西路");
strcpy(M.site[19].name, "北京大学东门");
strcpy(M.site[19].intro, "位于中国北京市海淀区境内");
strcpy(M.site[20].name, "中关村");
strcpy(M.site[20].intro, "位于北京市海淀区中关村一桥南侧");
strcpy(M.site[21].name, "海淀黄庄");
strcpy(M.site[21].intro, "是北京地铁4号线和北京地铁10号线的换乘站");
strcpy(M.site[22].name, "人民大学");
strcpy(M.site[22].intro, "位于北京市海淀区四通桥");
strcpy(M.site[23].name, "国家图书馆");
strcpy(M.site[23].intro, "国家图书馆站位于国家图书馆的南侧地下");
strcpy(M.site[24].name, "动物园");
strcpy(M.site[24].intro, "位于北京市西直门外大街");
strcpy(M.site[25].name, "北京南站");
strcpy(M.site[25].intro, "位于中国北京市丰台区铁路北京南站下方");
strcpy(M.site[26].name, "西红门");
strcpy(M.site[26].intro, "位于中国北京市大兴区境内");
strcpy(M.site[27].name, "生物医药基地");
strcpy(M.site[27].intro, "是北京地铁4号线的一座车站,位于北京市大兴区新源大街与永大路交口南侧");
strcpy(M.site[28].name, "天坛东门");
strcpy(M.site[28].intro, "位于中国北京市东城区");
strcpy(M.site[29].name, "天通苑");
strcpy(M.site[29].intro, "是北京地铁5号线的一座车站也是北京第一个通过民意增加的地铁车站位于北京市昌平区立汤路与太平庄中二街交汇处北侧");
strcpy(M.site[30].name, "天通苑北");
strcpy(M.site[30].intro, "位于北京市昌平区天通苑北界太平庄北街以北400米处");
for (i = 1; i <= ALLNameNum; i++)
{
for (j = 1; j <= ALLNameNum; j++)
{
M.length[i][j] = INF;
}
}
for (i = 1; i <= ALLNameNum; i++)
M.length[i][i] = 0;
M.length[1][2] = M.length[2][1] = 30;
M.length[1][3] = M.length[3][1] = 30;
M.length[2][3] = M.length[3][2] = 90;
M.length[2][4] = M.length[4][2] = 70;
M.length[3][5] = M.length[5][3] = 50;
M.length[3][6] = M.length[6][3] = 50;
M.length[4][5] = M.length[5][4] = 50;
M.length[4][7] = M.length[7][4] = 100;
M.length[5][6] = M.length[6][5] = 30;
M.length[6][7] = M.length[7][6] = 110;
M.length[6][10] = M.length[10][6] = 20;
M.length[7][8] = M.length[8][7] = 30;
M.length[7][9] = M.length[9][7] = 30;
M.length[7][10] = M.length[10][7] = 30;
M.length[8][9] = M.length[9][8] = 30;
M.length[9][10] = M.length[10][9] = 60;
M.length[9][11] = M.length[11][9] = 40;
M.length[10][11] = M.length[11][10] = 40;
M.length[11][12] = M.length[12][11] = 100;
M.length[11][13] = M.length[13][11] = 50;
M.length[12][13] = M.length[13][12] = 60;
M.length[12][15] = M.length[15][12] = 30;
M.length[12][17] = M.length[17][12] = 170;
M.length[13][14] = M.length[14][13] = 70;
M.length[13][15] = M.length[15][13] = 30;
M.length[13][16] = M.length[16][13] = 50;
M.length[14][16] = M.length[16][14] = 50;
M.length[15][16] = M.length[16][15] = 20;
M.length[16][17] = M.length[17][16] = 30;
M.length[17][18] = M.length[18][17] = 60;
M.length[17][19] = M.length[19][17] = 30;
M.length[17][20] = M.length[20][17] = 170;
M.length[18][20] = M.length[20][18] = 70;
M.length[19][21] = M.length[21][19] = 30;
M.length[20][21] = M.length[21][20] = 50;
M.length[21][22] = M.length[22][21] = 50;
M.length[21][24] = M.length[24][21] = 20;
M.length[22][23] = M.length[23][22] = 30;
M.length[23][25] = M.length[25][23] = 60;
M.length[23][26] = M.length[26][23] = 30;
M.length[24][25] = M.length[25][24] = 170;
M.length[25][27] = M.length[27][25] = 70;
M.length[26][27] = M.length[27][26] = 30;
M.length[27][28] = M.length[28][27] = 50;
M.length[27][29] = M.length[29][27] = 50;
M.length[28][29] = M.length[29][28] = 20;
M.length[29][30] = M.length[30][29] = 30;
N = 30;
}
void queryAllSite()
{
int t;
printf("所有地点如下:\n");
for (t = 1; t <= N; t++)
{
printf("编号; %d\n 地点:%s\n 介绍:%s\n", t, M.site[t].name, M.site[t].intro);
}
printf("\n任意键返回");
getch();
}
void querySite()
{
int a;
printf("请问您要查询的地点编号是:");
scanf("%d", &a);
if (a > N)
printf("查询的地点不存在,查询失败!");
else
printf("编号:%d\n 地点:%s\n 介绍:%s\n", a, M.site[a].name, M.site[a].intro);
printf("\n按任意键返回!");
getch();
}
void dijkstraAllSite()
{
int v0;
printf("请输入查询的地点:");
scanf("%d", &v0);
bool flag[ALLNameNum];
//v表示上一个节点k表示遍历节点
int i, k, j, v, min, x;
for (v = 1; v <= N; v++)
{
flag[v]=0;
d[v] = M.length[v0][v];
if (d[v] < INF && d[v] != 0)
p[v] = v0;
else
p[v] = -1;
}
flag[v0] = 1;
d[v0] = 0;//原点距离
for (i = 2; i <= N; i++)
{
min = INF;
for (k = 1; k <= N; ++k)
if (!flag[k] && d[k] < min)
{//没有被查询过并且距离小于最小值则更新
v = k;
min = d[k];
}
if (min == INF)
return;
flag[v] = 1;
for (k = 1; k <= N; ++k)
if (!flag[k] && (min + M.length[v][k] < d[k]))
{
d[k] = min + M.length[v][k];//到k的距离
p[k] = v;//k节点的上一个节点是v
}
}
}
void printAllSite()
{
int st[ALLNameNum], i, pre, top = -1;
for (i = 1; i <= N; i++)
{
printf("\n到达地点%2d的总距离为: %5d , 经过路径为:", i, d[i]);
st[++top] = i;
pre = p[i];
while (pre != -1)
{
st[++top] = pre;
pre = p[pre];
}
while (top > 0)
{
printf("%d", st[top--]);
if (top > 0)
printf("--->");
}
}
getch();
}
void dijkstraTwoSite()
{
int v0;
printf("请输入起始地点所对应的编号:");
scanf("%d", &v0);
bool flag[ALLNameNum];
int i, k, j, v, min, x;
for (v = 1; v <= N; v++)
{
flag[v] = 0;
d[v] = M.length[v0][v];
if (d[v] < INF && d[v] != 0)
p[v] = v0;
else
p[v] = -1;
}
flag[v0] = 1;
d[v0] = 0;
for (i = 2; i <= N; i++)
{
min = INF;
for (k = 1; k <= N; ++k)
if (!flag[k] && d[k] < min)
{
v = k;
min = d[k];
}
if (min == INF)
return;
flag[v] = 1;
for (k = 1; k <= N; ++k)
if (!flag[k] && (min + M.length[v][k] < d[k]))
{
d[k] = min + M.length[v][k];
p[k] = v;
}
}
}
void printTwoSite()
{
int y;
printf("\n请输入目的地点所对应的编号:");
scanf("%d", &y);
int st[ALLNameNum], i, pre, top = -1;
for (i = 1; i <= N; i++)
{
if (i == y)
printf("\n总距离是: %5d , 经过路径为:", d[i]);
st[++top] = i;
pre = p[i];
while (pre != -1)
{
st[++top] = pre;
pre = p[pre];
}
while (top > 0)
{
if (i == y)
{
printf("%d", st[top--]);
if (top > 0)
printf("--->");
}
else
top--;
}
}
getch();
}
main()
{
init();
int x;
while (1)
{
printf("**********************************************************************\n");
printf("* 欢迎使用北京地铁路线规划系统 *\n");
printf("**********************************************************************\n");
printf("\n 0、退出程序 ");
printf("\n 1、输出所有站点及其介绍");
printf("\n 2、查询某一地铁站点及其介绍");
printf("\n 3、查询某一站点到其他所有站点的最短路径");
printf("\n 4、查询某两个站点之间的最短路径 ");
printf("\n*******************************************************************\n");
printf("地点编号对应:\n");
printf(" 1.苹果园 2.古城 3.八角游乐园 4.公主坟 5.复兴门 6.天安门西 7.建国门 8.永安门 9.鼓楼大街 10.雍和宫\n");
printf("11.朝阳门 12.北京站 13.崇文门 14.和平门 15.宣武门 16.长椿街 17.西直门 18.圆明园 19.北京大学东门 20.中关村 21.海淀黄庄 22.人民大学 23.国家图书馆 24.动物园 25.北京南站 26.西红门 27.生物医药基地 28天坛东门 29.天通苑 30.天通苑北\n ");
printf("\n请输入选项:");
scanf("%d", &x);
if (x == 0)
break;
else
switch (x)
{
case 1:queryAllSite(); break;
case 2:querySite(); break;
case 3:dijkstraAllSite(); printAllSite(); break;
case 4:dijkstraAllSite(); printTwoSite(); break;
}
system("cls");
}
}