题目0:
GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
思路:1,根据海大实际情况构造海大交通图纸。
2.借助邻接矩阵实现海大图的存储,
3,借助深度遍历函数遍历检查;
4,借助floyd算法构造出最短路径path[i][j],最短路径长度dist[i][j],其应该为友元函数;
5,主函数的实现;
调试成功后的代码:
#include<iostream>
#include<string>
using namespace std;
const int max=100;
int visited[max];
class h
{
public:
h(string a[],int n,int e);//构造海大图
~h(){} //析构函数arc[i][j];
void bianli(int v);//深度遍历调试
int ad_l(int n,string s);//地址转换成数组下标函数
private:
string ad[max];
int arc[max][max];
int adnum,arcnum;
string path[max][max];
int dist[max][max];
friend void hfloyd(h&);//floyd实现两点最短路径利用友元函数实现,友元函数并非成员函数,是改变了它对类成员的访问权限
friend void visit(h&,int line1,int line2);利用友元函数实现访问
};
h::h(string a[],int n,int e)//构造海大图
{
int i,j,k;
adnum=n;arcnum=e;
for(i=1;i<=adnum;i++)
ad[i]=a[i]; //为指针数组
for(i=1;i<=adnum;i++)
for(j=1;j<=adnum;j++)
arc[i][j]=5000;
for(k=1;k<=arcnum;k++)
{
cout<<"输入第"<<k<<"条路径两个端点下标编号: ";
cin>>i>>j;
while(i>adnum || j>adnum)
{
cout<<"请重新输入";
cin>>i>>j;
}
cout<<"该路径的长度: ";
cin>>arc[i][j];
while(arc[i][j]< 0)
{ cout<<"请重新输入";
cin>>arc[i][j];
}
arc[j][i]=arc[i][j];
}
}
void h::bianli(int v)//深度遍历调试
{
cout<<ad[v]<<" ";
visited[v]=1;//visited[max]为标记数组,在主函数里初始化。
for(int j=1;j<=adnum;j++)
if((arc[v][j]!=5000 )&& (visited[j]==0))bianli(j);
}
void hfloyd(h &a)//floyd实现两点最短路径利用友元函数实现
{
int i,j,k;
for(i=1;i<=a.adnum;i++)//初始化路径数组
for(j=1;j<=a.adnum;j++)
{
a.dist[i][j]=a.arc[i][j];
if(a.dist[i][j]!=5000)
a.path[i][j]=a.ad[i]+"->"+a.ad[j];
else a.path[i][j]=" ";
}
for(k=1;k<=a.adnum;k++) //依次加入每个顶点
for(i=1;i<=a.adnum;i++)
for(j=1;j<=a.adnum;j++)
if(a.dist[i][k]+a.dist[k][j]<a.dist[i][j])
{
a.dist[i][j]=a.dist[i][k]+a.dist[k][j];
a.path[i][j]=a.path[i][k]+","+a.path[k][j];
}
}
//利用友元函数实现访问
void visit(h&a,int line1,int line2)
{
cout<<"从"<<a.ad[line1]<<"-》"<<a.ad[line2]<<"的最短路径为:"<<endl;
cout<<a.path[line1][line2]<<endl;
cout<<"路程为: "<<a.dist[line1][line2]<<"m"<<endl;
}
int h::ad_l(int n,string s)//地址转换成数组下标函数
{
ad[0]=s;
int i=n;
while(ad[0]!=ad[i])
i--;
if(i==0)
{
cout<<"输入地点形式不对或该地点不存在,请重新输入: ";//若输入出错
cin>>s;
ad_l(n,s);
}
return i;
}
int main() //主函数的实现
{
int n,e;
cout<<"请输入海大交通图的地点个数,交通路线的个数: ";
cin>>n>>e;
string ad[max];
cout<<"请按地点下标依次输入海大交通图中的"<<n<<"个地点(从地点1开始):"<<endl;
for(int i=1;i<=n;i++)
cin>>ad[i];
h h1(ad,n,e); //构造海大图
cout<<"构造海大图完成,准备遍历"<<endl;
system("pause");
system("cls");
string s;
cout<<"请输入遍历出发点:";
cin>>s;
int line=h1.ad_l(n,s);
cout<<"遍历结果为:"<<endl;
h1.bianli(line); //遍历检查
cout<<endl;
cout<<"准备构造最短路径path[i][j],及其路程dist[i][j]"<<endl;
system("pause");
system("cls");
hfloyd(h1);//floyd实现两点最短路径利用友元函数实现
cout<<"构造最短路径path[i][j],路程dist[i][j]完成"<<endl;
cout<<endl;
cout<<"若要查找最短路线:"<<endl;
string s1,s2;
for(int j=0;j<6;j++)
{
cout<<"请输入出发点:";
cin>>s1;
int line1= h1.ad_l(n,s1);
cout<<"请输入目的地:";
cin>>s2;
int line2=h1.ad_l(n,s2);
visit(h1,line1,line2);//利用友元函数实现访问
system("pause");
}
return 0;
}
调试结果:
1.先构造出海大图:
继续构造:
继续构造:
构造完成:
2.遍历检查:
3.构造最短路径,实现查找最短路线:
总结:
好的方面:先总结出编程思路,按照思路来写,根据这个框架能够很快的将代码结构写出来;
不好的:c++基础有待于提高,一个sting让我费了好大的近;
敲代码时,一些变量敲错了,编译也没错,可执行时毛病就大了,很难发现这些错误.
很收益的经验: 对如何修改错误有了一定的掌握.
不说了,任重而道远.