学校导游系统(图的应用另一版本)

来源:互联网 发布:js引用js文件 编辑:程序博客网 时间:2024/04/27 17:45

 #include<iostream.h>
const int n=4;  //n表示校园图中顶点个数
const int e=5;  //e表示校园图中路径
bool visited[n+1]; 

#define max 32767

class graph
{
public:
 
 int arcs[n+1][n+1];  //领结矩阵
 int a[n+1][n+1];    //距离
 int path[n+1][n+1];  //景点
 void floyd(graph &t,const int n);
 void picture();
 void creatp(graph &t);
 void bfs(graph t);
};

void graph::picture()
{
 cout<<"   ******校园导游图******"<<endl;
 cout<<"以下是学校的景点"<<endl;
 cout<<"  ***************************"<<endl;
 cout<<"  *  1.校园门口   2.图书管  *"<<endl;
 cout<<"  *                         *"<<endl;
 cout<<"  *  3.饭堂       4.教学楼  *"<<endl;
 cout<<"  ***************************"<<endl;
 cout<<"以下是学校的路径图"<<endl;
 cout<<"    3"<<endl;
 cout<<"   1 *---------* 2  "<<endl;
 cout<<"     |        /| "<<endl;
 cout<<"     |       / | "<<endl;
 cout<<"     |      /  | "<<endl;
 cout<<"   4 |    9/   | 5  "<<endl;
 cout<<"     |    /    | "<<endl;
 cout<<"     |   /     | "<<endl;
 cout<<"     |  /      | "<<endl;
 cout<<"     | /       | "<<endl;
 cout<<"   3 *---------* 4   "<<endl;
 cout<<"    2"<<endl;
 
 cout<<"下面是景点与景点之间的距离和介绍:";
 cout<<"1.校园门口 --》2.图书管   距离为:3"<<endl;
 cout<<"1.校园门口 --》3.饭堂     距离为:4"<<endl;
 cout<<"2.图书管   --》4.教学楼   距离为:4"<<endl;
 cout<<"2.图书管   --》3.饭堂     距离为:9"<<endl;
 cout<<"3.饭堂     --》4.教学楼   距离为:5"<<endl;
 
 
 //校园图
}

void graph::creatp(graph &t)
{
 int i,j;
 for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
  if(i==j)t.arcs[i][j]=0;  //景点一样则距离为0
  else t.arcs[i][j]=max;  //i不等于j时
      t.arcs[1][2]=3;
   t.arcs[2][1]=3;
   t.arcs[2][4]=5;
   t.arcs[4][2]=5;
   t.arcs[3][1]=4;
   t.arcs[1][3]=4;
   t.arcs[3][2]=9;
   t.arcs[2][3]=9;
   t.arcs[3][4]=2;
   t.arcs[4][3]=2;
   //把景点跟距离用一个二围数组存储下来
}

void graph::floyd(graph &t,const int n)
{
  for(int i=1;i<=n;i++)
  for(int j=1;j<=n;j++)
  {
   t.a[i][j]=t.arcs[i][j];  //把距离付值给a.[i][j]
   if((i!=j)&&(a[i][j]<max))
    t.path[i][j]=i;
   else t.path[i][j]=0;
  }
  for(int k=1;k<=n;k++)
  {
   for(i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
    if(t.a[i][k]+t.a[k][j]<t.a[i][j])
    {
     t.a[i][j]=t.a[i][k]+t.a[k][j];
     t.path[i][j]=t.path[k][j];
    }
  }
 
}


void graph::bfs(graph t)  //从顶点i出发实现广度搜索搜索n
{
 
 int j,i;            //f,r分别为队列头,尾指针
 char ch;
 cout<<"请输入一个你想去的地方:";
 cin>>i;
 while(i<=4)
 {
 //cout<<t.arcs;//输出访问点
 //for(i;i<=n;i++)
  if(i==1)cout<<"这里就是你要去的地方拉!!"<<endl<<endl;
 
  else
  {
  for(j=1;j<=n;j++)
  {
   if(i!=j)
   {
    cout<<"距离为"<<t.a[i][j]<<":  ";
    int next=t.path[i][j];
    cout<<j;
    while(next!=i)
    {
     cout<<"--"<<next;
     next=t.path[i][next];
    }
    cout<<"--"<<i<<endl;
   }
  }
  cout<<"等我推荐一条最佳路径供你返回吧(y/n):";
 
  }
  cin>>ch;
  if(ch=='y')
  {
    if(i==2) cout<<"2--4--3--1"<<endl;
    if(i==3) cout<<"3--2--1或者3--4--2--1"<<endl;
    if(i==4) cout<<"如果你想去四景点我们会带你游览学校全景:1--2--4--3--1"<<endl;
    cout<<"你还想去别的地方吗?(y/n)";
    cin>>ch;
      if(ch=='y') {cout<<"请输入一个你想去的地方:"; cin>>i;}
      if(ch!='y')
   {
     cout<<"          *****退出程序*****"<<endl;
     cout<<"             欢迎下次再来"<<endl;
     break;
   }
  }
  else
  {
   break;
  }
 
 }
    
}


 
void main()
{

 graph t;
 t.picture();
 t.creatp(t);
 t.floyd(t,n);
 t.bfs(t);

}

 

原创粉丝点击