| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1646 人关注过本帖
标题:高手们帮个忙吧,看看这个程序打印景点距离和任意两景点间最短路径哪有问题
只看楼主 加入收藏
star5578
Rank: 2
等 级:论坛游民
帖 子:39
专家分:11
注 册:2010-7-31
结帖率:25%
收藏
 问题点数:0 回复次数:19 
高手们帮个忙吧,看看这个程序打印景点距离和任意两景点间最短路径哪有问题
void display(int i,int j)
{ int a,b;
a=i;
b=j;
cout<<"\n";
cout<<"您要查询的两景点间最短路径是:\n\n";
if(shortest[i][j]!=MaxVertexNum)
{ if(i<j)
{ cout<<b;
while(path[i][j]!=0)
{/* 把i到j的路径上所有经过的景点按逆序打印出来*/
cout<<"<-"<<path[i][j];
if(i<j)
j=path[i][j];
else
i=path[j][i]; }
cout<<a;
printf("\n\n");
cout<<a<<"->"<<b<<"最短距离是"<<shortest[a][b]<<"米"<<"\n\n";
}
else
{ cout<<a;
while(path[i][j]!=0)
{/* 把i到j的路径上所有经过的景点按顺序打印出来*/
cout<<"<-"<<path[i][j];
if(i<j)
j=path[i][j];
else
i=path[j][i];}
cout<<b;
printf("\n\n");
cout<<a<<"->"<<b<<"最短距离是"<<shortest[a][b]<<"米"<<"\n\n";
 }
}
else
printf("输入错误!不存在此路!\n\n");
cout<<"\n";
}/*display*/
搜索更多相关主题的帖子: 景点 距离 路径 
2010-07-31 20:21
mxs810
Rank: 9Rank: 9Rank: 9
来 自:火星
等 级:贵宾
威 望:16
帖 子:234
专家分:1122
注 册:2006-10-19
收藏
得分:0 
贴一下完整代码~~

程序和预想的有什么不一样,说出来,找问题才有的放矢~~

授人以鱼不如授人以渔
2010-08-01 10:23
star5578
Rank: 2
等 级:论坛游民
帖 子:39
专家分:11
注 册:2010-7-31
收藏
得分:0 
回复 2楼 mxs810
程序代码:
//下面是完整代码,我的题目是“校园导游”,要求从某一个近点出发到另一个景点,计算出它们之间经过的最短距离打印出来,并且同时也打印出来都,经过了那些景点,就是这//个功能总是出现问题,帮帮我吧!





#include<iostream>
#include<string>
using namespace std;
#define MaxVertexNum 100   /*景点个数最大50*/
#define MAXCOST 1000  /*定义路径的无穷大*/
#define T 11           /*目前景点个数*/

typedef struct
{
    char name[20];     /*景点名称*/
    char introduce[100]; /*景点简介*/
}Elemtype;
typedef struct
{

   int num;            /*顶点编号*/ 
   Elemtype date;      /*顶点信息*/
}Vertex;               /*定义顶点*/

typedef struct
{
   Vertex vexs[MaxVertexNum];   /*存放顶点的一维数组,数组第零个单元没有用上*/
   unsigned int edges[MaxVertexNum][MaxVertexNum]; /*存放路径的长度*/
   int n,e;
}MGraph;

MGraph MGr;    /*全局变量,定义MGr为MGraph类型*/
int shortest[MaxVertexNum][MaxVertexNum];  /*定义全局变量存贮最小路径*/
int path[MaxVertexNum][MaxVertexNum];      /*定义存贮路径*/

void init()
{

 int i,j;

 MGr.vexs[1].num=1;

 strcpy(MGr.vexs[1].date.name,"校门");

 strcpy(MGr.vexs[1].date.introduce,"挨着阳光大街,坐良乡环城1路很方便。");

  MGr.vexs[2].num=2;

 strcpy(MGr.vexs[2].date.name,"体育馆");

 strcpy(MGr.vexs[2].date.introduce,"集乒乓球馆、羽毛球馆、健身馆、大型校级活动场馆于一身的混合型馆。");

  MGr.vexs[3].num=3;

 strcpy(MGr.vexs[3].date.name,"操场");

 strcpy(MGr.vexs[3].date.introduce,"上室外体育课的地方,也是运动的一个好地方。");


 MGr.vexs[4].num=4;

 strcpy(MGr.vexs[4].date.name,"工科实践中心");

 strcpy(MGr.vexs[4].date.introduce,"一些工科实践课上课的地方,里面设备都是比较好的。");


 MGr.vexs[5].num=5;

 strcpy(MGr.vexs[5].date.name,"工科教学楼");

 strcpy(MGr.vexs[5].date.introduce,"上课的主要地方,里面也有可以自由上机的机房。");


 MGr.vexs[6].num=6;

 strcpy(MGr.vexs[6].date.name,"师生服务中心");

 strcpy(MGr.vexs[6].date.introduce,"这是校园区唯一一个可以吃放买东西的地方。");


 MGr.vexs[7].num=7;

 strcpy(MGr.vexs[7].date.name,"文科教学楼");

 strcpy(MGr.vexs[7].date.introduce,"也是上课的主要地方。");


 MGr.vexs[8].num=8;

 strcpy(MGr.vexs[8].date.name,"报告厅");

 strcpy(MGr.vexs[8].date.introduce,"主要是作报告听讲座的地方,学校的网络中心也在这里面。");


 MGr.vexs[9].num=9;

 strcpy(MGr.vexs[9].date.name,"图书馆");

 strcpy(MGr.vexs[9].date.introduce,"分四层,里面有大量的书籍报刊供师生借阅。");


 MGr.vexs[10].num=10;

 strcpy(MGr.vexs[10].date.name,"钟楼");

 strcpy(MGr.vexs[10].date.introduce,"学校的安保系统都在这里面。");


 MGr.vexs[11].num=11;

 strcpy(MGr.vexs[11].date.name,"下沉式小广场");

 strcpy(MGr.vexs[11].date.introduce,"环境最令人惬意的地方,这边的大屏幕有时播放一些电视节目。");

  for(i=1;i<=T;i++)
    {
       for(j=1;j<=T;j++)
       {
          MGr.edges[i][j]=MAXCOST;
       }
    }
   for(i=1;i<=T;i++)
   {
      shortest[i][i]=0;
   }  /*初始化*/
   MGr.edges[1][10]=MGr.edges[10][1]=10;
   MGr.edges[1][9]=MGr.edges[9][1]=14;
   MGr.edges[2][3]=MGr.edges[3][2]=22;
   MGr.edges[2][10]=MGr.edges[10][2]=50;
   MGr.edges[3][4]=MGr.edges[4][3]=38;
   MGr.edges[3][10]=MGr.edges[10][3]=46;
   MGr.edges[3][11]=MGr.edges[11][3]=87;
   MGr.edges[4][5]=MGr.edges[5][4]=15;
   MGr.edges[5][6]=MGr.edges[6][5]=9;
   MGr.edges[5][11]=MGr.edges[11][5]=43;
   MGr.edges[6][7]=MGr.edges[7][6]=73;
   MGr.edges[6][11]=MGr.edges[11][6]=35;
   MGr.edges[7][8]=MGr.edges[8][7]=27;
   MGr.edges[7][11]=MGr.edges[11][7]=31;
   MGr.edges[8][9]=MGr.edges[9][8]=20;
   MGr.edges[9][10]=MGr.edges[10][9]=42;

 

 
} 

void introduce()
{
     int n;
     cout<<"请输入查询景点编号:"<<endl;
     cin>>n;
     switch(n)
     {
              case 1:
                   cout<<"景点名称:"<<MGr.vexs[1].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[1].date.introduce<<endl;
                   break;
              case 2:
                   cout<<"景点名称:"<<MGr.vexs[2].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[2].date.introduce<<endl;
                   break;
              case 3:
                   cout<<"景点名称:"<<MGr.vexs[3].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[3].date.introduce<<endl;
                   break;
              case 4:
                   cout<<"景点名称:"<<MGr.vexs[4].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[4].date.introduce<<endl;
                   break;
              case 5:
                   cout<<"景点名称:"<<MGr.vexs[5].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[5].date.introduce<<endl;
                   break;
              case 6:
                   cout<<"景点名称:"<<MGr.vexs[6].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[6].date.introduce<<endl;
                   break;
              case 7:
                   cout<<"景点名称:"<<MGr.vexs[7].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[7].date.introduce<<endl;
                   break;
              case 8:
                   cout<<"景点名称:"<<MGr.vexs[8].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[8].date.introduce<<endl;
                   break;
             case 9:
                   cout<<"景点名称:"<<MGr.vexs[9].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[9].date.introduce<<endl;
                   break;
             case 10:
                   cout<<"景点名称:"<<MGr.vexs[10].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[10].date.introduce<<endl;
                   break;
             case 11:
                   cout<<"景点名称:"<<MGr.vexs[11].date.name<<"\n";
                   cout<<"景点简介:"<<MGr.vexs[11].date.introduce<<endl;
                   break;

              default:
                   cout<<"输入序号错误。";
                      break;
                      }
}
void floyd()
{
   int i,j,k;
   for(i=1;i<=T;i++)
   {
     for(j=1;j<=T;j++)
     {
       shortest[i][j]=MGr.edges[i][j];
       path[i][j]=0;
     }
   }   /*初始化数组*/
   for(k=1;k<=T;k++)
   {
      for(i=1;i<=T;i++)
      {
         for(j=1;j<=T;j++)
         {
            if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))
            {
               shortest[i][j]=shortest[i][k]+shortest[k][j];
               path[i][j]=k;
               path[j][i]=k;/*记录经过的路径*/
            }//end_if
         }
      }
   }//end_for
}
void display(int i,int j)
{/* 打印两个景点的路径及最短距离 */

 int a,b;

 a=i;

 b=j;

 cout<<"\n";

 cout<<"您要查询的两景点间最短路径是:\n\n";

 if(shortest[i][j]!=MaxVertexNum)

 {

 if(i<j)

 {

 cout<<b;

 while(path[i][j]!=0)

 {/* 把i到j的路径上所有经过的景点按逆序打印出来*/
  cout<<"<-"<<path[i][j];
  if(i<j)
   j=path[i][j];
   else
    i=path[j][i];
    }

 cout<<"<-"<<a;

 cout<<"\n\n";

 cout<<a<<"->"<<b<<"最短距离是"<<shortest[a][b]<<""<<"\n\n";

 }

 else
  {
   cout<<a;
   while(path[i][j]!=0)
   {/* 把i到j的路径上所有经过的景点按顺序打印出来*/
    cout<<"->"<<path[i][j];
    if(i<j)
     j=path[i][j];
     else
      i=path[j][i];
      }
      cout<<"->"<<b;
      cout<<"\n\n";
      cout<<a<<"->"<<b<<"最短距离是:"<<shortest[a][b]<<"米\n\n"<<endl;
      }
      }
      else
       cout<<"输入错误!不存在此路!\n\n";
  }/*display*/
int shortestdistance()
{/*要查找的两景点的最短距离*/

 int i,j;

 cout<<"请输入要查询的两个景点的编号(1->11的数字编号并用间隔一个空格):";

 cin>>i>>j;

 if(i>T||i<=0||j>T||j<0)

 {

 cout<<"输入信息错误!\n\n";

 cout<<"  请输入要查询的两个景点的编号(1->11的数字编号并间隔一个空格):\n";

 cin>>i>>j;

 }

 else

 {

 floyd();

 display(i,j);

 }

 return 1;
}/*shortestdistance*/



void main()
{
   char k;
   init();
      

      cout<<"*******************************************************************\n";
      cout<<"*                                                                 *\n";
      cout<<"*                                                                 *\n";
      cout<<"*                      欢迎使用校园导游咨询                       *\n";
      cout<<"*                                                                 *\n";     
      cout<<"*******************************************************************\n";
    
while(1)

 {
      cout<<"校园景点及编号:\n";
      cout<<"    1——校门              7——文科教学楼\n";
      cout<<"    2——体育馆            8——报告厅\n";
      cout<<"    3——操场              9——图书馆\n";
      cout<<"    4——工科实践中心      10——钟楼\n";
      cout<<"    5——工科教学楼        11——下沉式小广场\n";
      cout<<"    6——师生服务中心\n";
      cout<<"*******************************************************************\n";
      cout<<"1.景点信息查询请按 i 键\n";
      cout<<"2.景点最短路径查询请按 s 键\n";
      cout<<"3.退出系统请按 e 键\n";
      cout<<"请选择服务:";
      cin>>k;
  
      switch(k)
      {
      
        case 'i':
             cout<<"*******************************************************************\n";
           
             introduce();
             cout<<"*******************************************************************\n";
             break;
        case 's':
             cout<<"*******************************************************************\n";
          
             shortestdistance();
             cout<<"*******************************************************************\n";
             break;
        case 'e':
              exit(0);
          
       }
   }
system("pause");
}
2010-08-01 12:18
mxs810
Rank: 9Rank: 9Rank: 9
来 自:火星
等 级:贵宾
威 望:16
帖 子:234
专家分:1122
注 册:2006-10-19
收藏
得分:0 
display()输出的结果和你预想的有什么不一样呢?
说清楚一点~~~

授人以鱼不如授人以渔
2010-08-01 13:01
star5578
Rank: 2
等 级:论坛游民
帖 子:39
专家分:11
注 册:2010-7-31
收藏
得分:0 
回复 4楼 mxs810
比如查询1号景点到6号景点的最短路径和经过的景点,应该输出1-10-3-4-5-6,但是输出的却是6-10-1
再发一张我画的跟这个程序匹配的地图间图吧,在附件里
校园图.rar (8.28 KB)
2010-08-01 14:31
mxs810
Rank: 9Rank: 9Rank: 9
来 自:火星
等 级:贵宾
威 望:16
帖 子:234
专家分:1122
注 册:2006-10-19
收藏
得分:0 
回复 5楼 star5578
帮你看了一下,只能帮你定位错误有可能是什么地方哦了?

应该是floyd()排序没有排好,
path数组里的内容不正确。

就按“1-6”的来说path[1][6]和path[6][1]都是10,应该是不正确的吧~~

仅供参考

授人以鱼不如授人以渔
2010-08-02 13:04
star5578
Rank: 2
等 级:论坛游民
帖 子:39
专家分:11
注 册:2010-7-31
收藏
得分:0 
回复 6楼 mxs810
谢谢!
2010-08-02 16:12
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
没细看,纯属凭感觉瞎蒙。错了别怪我啊。
  for(i=1;i<=T;i++)
   {
      for(j=1;j<=T;j++)
      {
         for(k=1;k<=T;k++)
         {
            if(shortest[i][j]>(shortest[i][k]+shortest[k][j]) && (i != j))
            {
               shortest[i][j]=shortest[i][k]+shortest[k][j];
               i > j ? path[i][j]=k : path[j][i]=k;               
            }//end_if
         }
      }
   }//end_for

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-02 18:19
star5578
Rank: 2
等 级:论坛游民
帖 子:39
专家分:11
注 册:2010-7-31
收藏
得分:0 
回复 8楼 东海一鱼
呵呵,照你的修改方法我改了,结果是经过的景点都不显示了,只能打印起点和终点
2010-08-02 18:28
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
不会吧,这末背运???!!!!!

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-02 18:35
快速回复:高手们帮个忙吧,看看这个程序打印景点距离和任意两景点间最短路径哪有 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.078395 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved