CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

怎样用递归寻找所有路径算法?????????????赐教!

楼主onethousand(越来)2004-04-04 08:47:49 在 专题开发/技术/项目 / 数据结构与算法 提问

这些天学递归,碰到这个例子,好些天不得其解,望知情者告知,当天重谢!!!  
   
  1--3--5--7--9  
  |\   |\   |\   |\   |  
  0--2--4--6--8  
   
  输出0->n(1<=n&&n<=9)的所有路径,  
  由低位到高位   如0->2:0-->2  
                                            0-->1-->2  
   
  谢谢!  
  问题点数:100、回复次数:28Top

1 楼mmmcd(超超)回复于 2004-04-04 11:27:05 得分 7

看看效果,  
   
  随手改了一个没调试  
   
  #define   MAX   10  
  #include   <stdio.h>  
  int   path[MAX]={0};  
  int   n;  
   
  void   f(int   i,int   j)  
  {  
        int   k;  
        if(j==n)  
        {  
              for(k=1;k<=i;k++)  
              {  
                      printf("-->%d   ",path[k]);  
                }  
              printf("\n");  
        }  
        if(j>=n)return;  
        for(k=path[i]+1;k<=path[i]+2;k++)  
        {  
              path[i+1]=k;  
              f(i+1,k);  
        }  
  }  
   
  void   main()  
  {  
      int   n;  
      path[0]=1;  
      while(scanf("%d",&n)==1)  
      {  
          printf("0");  
          f(0,0);  
      }  
      getchar();  
  }    
   
  Top

2 楼onethousand(越来)回复于 2004-04-04 14:45:11 得分 0

编译链接没错误,语法拽!  
   
  结果不正确  
  没有输出!!  
   
  高手可否再看一下???  
  高分伺候!!Top

3 楼onethousand(越来)回复于 2004-04-04 14:47:45 得分 0

我希望看到递归的结果,最好有C++示例。  
  Top

4 楼aheadyes()回复于 2004-04-04 14:50:53 得分 12

#define   N   6  
  #include   <stdio.h>  
  int   used[N]={0};  
   
  void   output()  
  {  
        int   i;  
        for(i=0;i<=N;i++)   if(used[i]&&used[N-1]==1)printf("%d-->   ",i);  
        printf("\n");  
  }  
   
  void   f(int   i)  
  {  
        if(i>=N)  
        {      
              output();  
              return;  
               
        }    
        used[i]=1;  
        f(i+1);    
        if(i+2<=N)  
        {  
            f(i+2);  
            used[i]=   0;  
        }  
      else    
            used[i]   =   0;  
   
       
  }  
   
  void   main()  
  {  
      f(0);  
      getchar();  
  }    
   
   
  Top

5 楼aheadyes()回复于 2004-04-04 15:03:20 得分 0

更为正确的如下:)  
   
  #define   N   4  
  #include   <stdio.h>  
  int   used[N+1]={0};  
   
  void   output()  
  {  
        int   i;  
        for(i=0;i<N;i++)   if(used[i]&&used[N]==1)printf("%d-->   ",i);  
        if(used[N]==1)   printf("%d",i);  
        printf("\n");  
  }  
   
  void   f(int   i)  
  {  
        if(i>=N+1)  
        {      
              output();  
              return;  
               
        }    
        used[i]=1;  
        f(i+1);    
        if(i+2<N+1)  
        {  
            f(i+2);  
            used[i]=   0;  
        }  
      else    
            used[i]   =   0;  
   
       
  }  
   
  void   main()  
  {  
      f(0);  
      getchar();  
  }    
   
   
  Top

6 楼onethousand(越来)回复于 2004-04-04 15:19:09 得分 0

 
   
  我希望看到能输出0--9之间每个数字的的所有路径,  
  如:0-1;0-2;0-3;0-4;......0-9;的路径  
  其中比如0-2:又有0->2;0->1->2两条。  
   
  上面的兄台好像没有完全理解我的意思。  
   
  Top

7 楼onethousand(越来)回复于 2004-04-04 15:20:22 得分 0

不够已经很接近了,待我慢慢参考.  
  谢谢!Top

8 楼aheadyes()回复于 2004-04-04 15:27:29 得分 0

上面的只是0-N的路径;  
  如果你要:0-1;0-2;0-3;0-4;......0-9;的路径  
  那么加个循环不就得了:)  
  Top

9 楼aheadyes()回复于 2004-04-04 15:30:25 得分 0

void   main()  
  {    
    for(int   i=0;   i<=N;   i++)  
            f(i);  
      getchar();  
  }Top

10 楼onethousand(越来)回复于 2004-04-04 15:59:45 得分 0

好像不太符合要求  
  即时N=9时  
  也不能输出所有的路径。Top

11 楼aheadyes()回复于 2004-04-04 17:09:54 得分 0

呵呵   上面的是求出i-n(0=<i<=   n)的路径  
    原来你是要求  
    0-1;0-2;0-3;0-4;......0-9;的路径呀:)  
   
   
  #include   <stdio.h>  
  void   f(int   i,int   used[],int   N)  
  {  
   
        if(i>=N+1)  
        {      
            int   i;  
            for(i=0;i<N;i++)    
                  if(used[i]&&used[N]==1)     printf("%d-->   ",i);  
            if(used[N]==1)   printf("%d",i);  
            printf("\n");  
            return;  
               
        }    
        used[i]=1;  
        f(i+1,used,N);    
        if(i+2<N+1)  
        {  
            f(i+2,used,N);  
            used[i]=   0;  
        }  
      else    
            used[i]   =   0;  
   
       
  }  
   
  void   main()  
  {    
      int   used[9]={0};  
      for(int   i=1;   i<=9;   i++)  
      f(0,used,i);  
      getchar();  
  }    
   
  全部满足条件:)   给分   @_@  
  Top

12 楼onethousand(越来)回复于 2004-04-04 18:24:02 得分 0

@_@  
  不好意思,不正确,不能给分  
   
  N=9时  
  显然缺少0->1->2->3->4->5->6->7->8->9  
  这条路径Top

13 楼aheadyes()回复于 2004-04-04 18:42:08 得分 10

看清楚点,   没有吗?   你确定.   我运行的时候有啊Top

14 楼chenzhichao2008(陈智超)回复于 2004-04-05 16:35:48 得分 0

楼上的你的程序确实还没找到所有的解  
  你把9改为4或者3你就知道了Top

15 楼liangbch(宝宝)回复于 2004-04-05 17:36:47 得分 8

我的程序应该没有问题,在vc6.0下调试通过。  
   
  #include   "stdafx.h"  
  #define   POINT_COUNT   10  
   
  void   printPath(int   a[],int   n)  
  {  
  int   i;  
  for   (   i=0;i<n;i++)  
  {  
  printf("%d",a[i]);  
  if   (i   <=n-2)  
  printf("->");  
  }  
  printf("\n");  
  }  
   
  void   searchCore(int   a[],int   count,int   end)  
  {  
  int   beg,i;  
  if   (   a[count-1]==end)  
  {  
    printPath(a,count);  
    return;  
  }  
  else  
  {  
  beg=a[count-1];  
  for   (   i=beg+1;i<=end;i++)  
  {  
  a[count]=i;  
  searchCore(a,count+1,end);  
  }  
  }  
  }  
   
  void   searchPath(int   beg,int   end)  
  {  
  int   pointArr[POINT_COUNT];  
  pointArr[0]=beg;  
          searchCore(pointArr,1,end);  
  }  
   
  int   main(int   argc,   char*   argv[])  
  {  
  searchPath(0,9);  
  return   0;  
  }  
  Top

16 楼onethousand(越来)回复于 2004-04-05 20:59:06 得分 0

这边没人通过,  
  http://expert.csdn.net/Expert/topic/2923/2923615.xml?temp=.4314234  
   
  上面的兄台,头文件错了,改成stdio.h后,也是运行不对,能0->9吗?Top

17 楼chenzhichao2008(陈智超)回复于 2004-04-06 06:50:31 得分 5

这应该总共有88条路(0-9)Top

18 楼liangbch(宝宝)回复于 2004-04-06 13:03:51 得分 0

to   onethousand:  
        是编译不过呢,还是运行结果不对呢?  
        如果是编译不过,请在vc下作这样的设置:    
        1.将   #include   stdafx.h   改为  
            #include   "stdlib.h"  
            #include   "stdio.h"  
   
        2.   点击   project->setting   菜单,设置   C/C++   ->   Category   中的   Precompiled   Headers   为Not   using   precompiled   headers.  
  Top

19 楼onethousand(越来)回复于 2004-04-07 12:30:13 得分 0

to   宝宝  
      是这样的,比如说求0->9的路径;  
      不可能有这条路径:0—>9;就像我上面画的图,要经过其他数字。最短的也就是0—>2->4->6->8->9;或0->1->3->5->7->9.  
      不好意思,可能是我说得不够清楚Top

20 楼liangbch(宝宝)回复于 2004-04-07 13:05:46 得分 0

哦,我明白了,这样的话,程序就需要更加复杂一些,首先得建立一个10*10的矩阵,用来表示那些路径是相同的,那些路径是不相同的。在递归程序中,添加节点时加一些判断,只有路径试连同时,才可以增加节点,程序等有空儿时写。Top

21 楼sogald_2001(纳兰无忌)回复于 2004-04-07 14:00:51 得分 15

不用递归行不?  
  上面有递归算法了,下面这个不是递归算法:  
   
  #include   <vector>  
  #include   <algorithm>  
  #include   <iostream>  
   
   
  /*  
  起点为0,终点为n  
  考虑通路   0   ->   1   ->   2   ->   ...   ->   n-1   ->   n  
  算法:  
      第i次扫描,保持前面从   0-i的路径不变,判断是否有从i到i+2的不同于i->   i+1   ->   i+2   的其它路径,如有  
        不妨设为V,则路径   0->   1-   >...->   i-1   ->   V   ->   i+3->...->   n为一条新路径,   由于i   和   i+2   直接有边连接  
        所以V总存在,且仅一条.  
        i   从0   到   n-2  
  */  
   
  void   Path(int   n)  
  {  
  typedef   std::vector<int>     path_type;  
  typedef   std::vector<path_type>   paths_type;  
   
  path_type   basic;  
  for(int   i=0;   i   <   n+1;   ++   i)  
  basic.push_back(i);  
   
  paths_type   path_set;  
  path_set.push_back(basic);  
   
  //依次从0-N中取出一个点j   (   j   =   1,2   ...   n-1)  
  for(i=1;   i   <   n;   ++   i)    
  {  
  path_type   new_path(basic);  
  new_path.erase(std::remove(new_path.begin(),   new_path.end(),   i))   ;  
  path_set.push_back(new_path);  
  }  
   
  std::ostream_iterator<int>   output(std::cout,   "   ");  
  for(paths_type::const_iterator   citer   =   path_set.begin();   citer   !=   path_set.end();   ++   citer)  
  {  
  std::copy(   citer->begin(),   citer->end(),   output);  
  std::cout   <<   std::endl;  
  }  
  }  
   
   
  另外一种方法:  
  看成一个图,数字为顶点,从小数字到大数字是一条有向边,问题转化为在一个有向图中寻求两个顶点间的路径集合问题,这可以利用成熟的图的搜索算法。  
  Top

22 楼gudfen(帝波微)回复于 2004-04-07 14:20:29 得分 15

#include   "stdafx.h"  
  #include   "iostream.h"  
  #include   <stdio.h>  
   
  void   print(int   i){  
   
  if(i==0)  
  cout<<"0";  
   
  if(i==1)  
  cout<<"0-->1";  
   
   
   
          if(i>1)  
   
  {    
  print(i-1);cout<<"-->"<<i<<endl;  
          print(i-2);cout<<"-->"<<i<<endl;  
  }  
             
  }  
  void   main(){  
      int   no;  
      cout<<"Input   the   destination   :";  
      cin>>no;  
       
      print(no);  
   
  }  
  为什么不对?Top

23 楼privet(阿朱)回复于 2004-04-07 22:30:48 得分 18

应自下到上递归,以下是我的递归算法  
  #include   <iostream.h>  
  int   a[9];                         //记录走国的数字  
  int   N=0;                           //记录走过的步数  
  int   m=0;                           //记录得到的走法数  
   
  void   print()                           //输出函数  
  {for(int   i=0;i<N-1;i++)  
      cout<<a[i]<<"-->";  
      cout<<a[N-1]<<endl;  
      m++;}  
   
  void   recur(int   i,int   n)           //递归函数  
    {    
        a[N++]=i;  
        if(n==i)   {   print();return;}  
          recur(i+1,n);                         //向前一步  
          N--;                                           //回退  
        if(i+2<=n)  
          {recur(i+2,n);                       //向前二步  
            N--;}                                       //回退  
   
      }  
  main()                                               //主函数  
  {     int   b,e;  
        cout<<"Please   input   begin   integer:"<<endl;  
        cin>>b;  
        cout<<"Please   input   end   integer:"<<endl;  
        cin>>e;  
        recur(b,e);  
        cout<<"The   number   of   roads   is   "<<m;  
        }Top

24 楼privet(阿朱)回复于 2004-04-07 22:33:40 得分 0

路的条数的递推式是:A[n]=A[n-1]+A[n-2}  
  A[1]=1,A[2]=2,  
  计算得A[9]=55  
  Top

25 楼mmmcd(超超)回复于 2004-04-08 12:13:48 得分 5

还是上面一楼那个程序,VC6下调了一下  
   
  #define   MAX   10  
  #include   <stdio.h>  
  int   path[MAX]={0};  
  int   n;  
   
  void   f(int   i,int   j)  
  {  
        int   k;  
        if(j==n)  
        {  
      printf("0");  
              for(k=1;k<=i;k++)  
              {  
                      printf("-->%d",path[k]);  
                }  
              printf("\n");  
        }  
        if(j>=n)return;  
        for(k=path[i]+1;k<=path[i]+2;k++)  
        {  
              path[i+1]=k;  
              f(i+1,k);  
        }  
  }  
   
  void   main()  
  {  
      //int   n;         注释掉  
      path[0]=0;  
      while(scanf("%d",&n)==1)  
      {          
          f(0,0);  
      }  
      getchar();  
  }  
   
   
  9  
  0-->1-->2-->3-->4-->5-->6-->7-->8-->9  
  0-->1-->2-->3-->4-->5-->6-->7-->9  
  0-->1-->2-->3-->4-->5-->6-->8-->9  
  0-->1-->2-->3-->4-->5-->7-->8-->9  
  0-->1-->2-->3-->4-->5-->7-->9  
  0-->1-->2-->3-->4-->6-->7-->8-->9  
  0-->1-->2-->3-->4-->6-->7-->9  
  0-->1-->2-->3-->4-->6-->8-->9  
  0-->1-->2-->3-->5-->6-->7-->8-->9  
  0-->1-->2-->3-->5-->6-->7-->9  
  0-->1-->2-->3-->5-->6-->8-->9  
  0-->1-->2-->3-->5-->7-->8-->9  
  0-->1-->2-->3-->5-->7-->9  
  0-->1-->2-->4-->5-->6-->7-->8-->9  
  0-->1-->2-->4-->5-->6-->7-->9  
  0-->1-->2-->4-->5-->6-->8-->9  
  0-->1-->2-->4-->5-->7-->8-->9  
  0-->1-->2-->4-->5-->7-->9  
  0-->1-->2-->4-->6-->7-->8-->9  
  0-->1-->2-->4-->6-->7-->9  
  0-->1-->2-->4-->6-->8-->9  
  0-->1-->3-->4-->5-->6-->7-->8-->9  
  0-->1-->3-->4-->5-->6-->7-->9  
  0-->1-->3-->4-->5-->6-->8-->9  
  0-->1-->3-->4-->5-->7-->8-->9  
  0-->1-->3-->4-->5-->7-->9  
  0-->1-->3-->4-->6-->7-->8-->9  
  0-->1-->3-->4-->6-->7-->9  
  0-->1-->3-->4-->6-->8-->9  
  0-->1-->3-->5-->6-->7-->8-->9  
  0-->1-->3-->5-->6-->7-->9  
  0-->1-->3-->5-->6-->8-->9  
  0-->1-->3-->5-->7-->8-->9  
  0-->1-->3-->5-->7-->9  
  0-->2-->3-->4-->5-->6-->7-->8-->9  
  0-->2-->3-->4-->5-->6-->7-->9  
  0-->2-->3-->4-->5-->6-->8-->9  
  0-->2-->3-->4-->5-->7-->8-->9  
  0-->2-->3-->4-->5-->7-->9  
  0-->2-->3-->4-->6-->7-->8-->9  
  0-->2-->3-->4-->6-->7-->9  
  0-->2-->3-->4-->6-->8-->9  
  0-->2-->3-->5-->6-->7-->8-->9  
  0-->2-->3-->5-->6-->7-->9  
  0-->2-->3-->5-->6-->8-->9  
  0-->2-->3-->5-->7-->8-->9  
  0-->2-->3-->5-->7-->9  
  0-->2-->4-->5-->6-->7-->8-->9  
  0-->2-->4-->5-->6-->7-->9  
  0-->2-->4-->5-->6-->8-->9  
  0-->2-->4-->5-->7-->8-->9  
  0-->2-->4-->5-->7-->9  
  0-->2-->4-->6-->7-->8-->9  
  0-->2-->4-->6-->7-->9  
  0-->2-->4-->6-->8-->9  
  Top

26 楼gudfen(帝波微)回复于 2004-04-08 15:48:53 得分 0

谢谢阿朱Top

27 楼liangbch(宝宝)回复于 2004-04-08 19:20:54 得分 5

增加了路径的判断,应该完整的回答了楼主的问题。  
   
  #include   "stdlib.h"  
  #include   "stdio.h"  
   
  //1--3--5--7--9  
  //|\   |\   |\   |\   |  
  //0--2--4--6--8  
   
  //注意:   const   关键字在C++中广泛使用,它可以增加程序的安全性,如果你对const不了解可以从程序中删除const,程序功能依然正确  
   
  #define   POINT_COUNT   10  
   
  void   printPath(int   a[],int   n)  
  {  
          int   i;  
          for   (   i=0;i<n;i++)  
          {  
                  printf("%d",a[i]);  
                  if   (i   <=n-2)  
                          printf("->");  
          }  
          printf("\n");  
  }  
   
  void   searchCore(const   char   connectionMatrix[10][10],int   a[],int   count,int   end)  
  {  
          int   beg,i;  
          if   (   a[count-1]==end)  
          {  
                  printPath(a,count);  
                  return;  
          }  
          else  
          {  
                  beg=a[count-1];  
                  for   (   i=beg+1;i<=end;i++)  
                  {  
                          if   (   connectionMatrix[beg][i]   >   0   )   //从beg到i有路可走  
                          {  
                                  a[count]=i;  
                                  searchCore(connectionMatrix,a,count+1,end);  
                          }  
                  }  
          }  
  }  
   
  void   searchPath(int   beg,int   end)  
  {  
          //各个节点是否有路可走的矩阵表示,  
          //connectionMatrix[i][j]:表示从   i   到   j是否有路可走,1:有路可走,0:不能走,  
          //   如果各个节点的路径不是题目中要求的样子,只需要修改connectionMatrix   即可  
          const   char   connectionMatrix[10][10]=      
          {  
                  {0,1,1,0,0,0,0,0,0,0},  
                  {0,0,1,1,0,0,0,0,0,0},  
                  {0,0,0,1,1,0,0,0,0,0},    
                  {0,0,0,0,1,1,0,0,0,0},    
                  {0,0,0,0,0,1,1,0,0,0},    
                  {0,0,0,0,0,0,1,1,0,0},    
                  {0,0,0,0,0,0,0,1,1,0},    
                  {0,0,0,0,0,0,0,0,1,1},    
                  {0,0,0,0,0,0,0,0,0,1},    
                  {0,0,0,0,0,0,0,0,0,0}  
          };  
          int   pointArr[POINT_COUNT];  
          pointArr[0]=beg;  
          searchCore(connectionMatrix,pointArr,1,end);  
  }  
   
  int   main(int   argc,   char*   argv[])  
  {  
          searchPath(0,9);  
          return   0;  
  }  
  Top

28 楼mysword(一怒拔剑)回复于 2004-04-08 20:21:36 得分 0

为什么这么简单的问题要有这么多人回答?  
  Top

相关问题

  • 求一个有向无环图中最长路径的递归算法
  • 有向图,求判断两个节点间有无路径到达的java算法,无递归最好
  • 求一递归算法?
  • 递归算法请教
  • C递归算法问题
  • 汉若塔的非递归算法???
  • 汉诺塔的非递归算法?
  • 简单的递归算法问题!!
  • 怎么中断递归算法?
  • 高分求一treeview的递归算法!!

关键词

  • 算法
  • 节点
  • 递归
  • 路径
  • connectionmatrix
  • beg
  • printpath
  • searchcore
  • citer
  • pointarr

得分解答快速导航

  • 帖主:onethousand
  • mmmcd
  • aheadyes
  • aheadyes
  • liangbch
  • chenzhichao2008
  • sogald_2001
  • gudfen
  • privet
  • mmmcd
  • liangbch

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo