题0:海大交通图

题目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让我费了好大的近;

敲代码时,一些变量敲错了,编译也没错,可执行时毛病就大了,很难发现这些错误.

很收益的经验: 对如何修改错误有了一定的掌握.

不说了,任重而道远.

        



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值