题目0.GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
#include <iostream>
#include <string>
using namespace std;
const Num = 9; //9个场所
const Max = 10000; //初始化边,请将不到达边初始值为最大值,这里使用10000
class MGraph
{
public:
MGraph(string a[], int e, int b[][Num]);
void Floyd();
void print();
private:
string vertex[Num];
int arc[Num][Num];
int vertexNum, arcNum;
int dist[Num][Num];
string path[Num][Num];
};
MGraph:: MGraph(string a[], int e, int b[][Num])
{
int i,j;
vertexNum = Num;
arcNum = e;
for(i = 0; i < vertexNum; i++)
vertex[i] = a[i];
for(i = 0; i < vertexNum; i++)
for(j = 0; j < vertexNum; j++)
arc[i][j] = b[i][j];
}
void MGraph::Floyd()
{
int i,j,k;
for(i = 0; i < vertexNum; i++) //初始化dist和path
for(j = 0; j < vertexNum; j++)
{
dist[i][j] = arc[i][j];
if(dist[i][j] != 10000)
path[i][j] = vertex[i] + "-->" + vertex[j];
else path[i][j] ="这里就是你要找的地方,不用走";
}
for(k = 0; k < vertexNum; k++) //判定顶点i j之间是否经过k
for(i = 0; i < vertexNum; i++)
for(j = 0; j < vertexNum; j++)
{
if(i == j) continue;
if(dist[i][k] + dist[k][j] < dist[i][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = path[i][k] + ",然后," + path[k][j];
}
}
}
void MGraph::print() //结点m到n的最短路径
{
int a,b,i;
char ch;
bool N = 1;
while(N)
{
cout << "您想了解哪两个场所的最短路径?请输入这两个场所的名称" << endl;
string ch1, ch2, ch11, ch22;
cin >> ch11 >> ch22; //请输入你的起点和终点。
bool P1 = 1, P2 = 1;
while(P1 == 1 || P2 == 1) //异常处理,预防至少有一个场所名称不存在情况
{
for(i = 0; i < Num; i++)
if(vertex[i] == ch22) { ch2 = ch22; P2 = 0; }
for(i = 0; i < Num; i++)
if(vertex[i] == ch11) { ch1 = ch11; P1 = 0; }
if(P1 == 1 || P2 == 1)
{
cout << "输入有误!至少有一个场所的名称是不存在的,请重新输入两个场所的名称" << endl;
cin >> ch11 >> ch22;
P1 = P2 = 1;
}
}
for(i = 0; i < vertexNum; i++)
if(vertex[i] == ch1) a=i;
for(i=0;i<vertexNum;i++)
if(vertex[i] == ch2) b=i;
cout << ch1 << "到" << ch2 << "的最短路径为:\n"
<< path[a][b] << "\n长度为" << dist[a][b] << endl;
N = 0;
cout << "还想继续了解吗?(Y或y为继续,N或n为停止)" << endl;
cin >> ch;
while(ch != 'Y' && ch != 'y' && ch != 'N' && ch != 'n')
{
cout << "请重新输入!" << endl;
cin >> ch;
}
if(ch == 'Y' || ch == 'y')
N = 1;
}
}
int main()
{
int a[Num][Num] =
{
{ Max, 600, 350, Max, Max, Max, 200, Max, Max },
{ 500, Max, Max, Max, Max, Max, Max, Max, Max },
{ Max, Max, Max, 500, Max, Max, Max, Max, Max },
{ Max, Max, 500, Max, 500, Max, Max, Max, Max },
{ Max, Max, Max, 500, Max, 50, 700, Max, 150 },
{ 400, Max, Max, Max, 50, Max, Max, Max, Max },
{ 200, Max, Max, Max, 200, Max, Max, 150, Max },
{ 440, Max, Max, Max, Max, Max, 150, Max, 900 },
{ Max, Max, Max, Max, 250, Max, Max, Max, Max }
};
string ch[] = {"第三饭堂","第四饭堂","医院","篮球场","体育馆","图书馆","钟海楼","主楼","商业中心"};
MGraph m(ch, 20, a);
m.Floyd();
m.print();
return 0;
}
收获和体会:
数据结构课已经上完了,但是,学无止境。虽然,我暂时无法成为老师那能带给他惊喜(图形化编程)的人,但是我没有放弃,现在开始学习一个软件也是图形化编程的,但与MFC不同,它叫Qt。我觉得,Qt比MFC更好,虽然我没有学过MFC,但是我见过MFC的代码,而且百度了一下,发现Qt果然在很多方面都比MFC好,具体的等我学完才能说得专业点。总之,继续奋斗!!!!!!!!!!!!!!!!