CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

100分想赠,企盼高手帮我解决这个小小的问题!

楼主icrcapple(披头士)2006-03-04 18:55:38 在 C/C++ / C语言 提问

小弟最近在算一个工厂的布局的物流程序,主要就是8个点之间找出一个合适的排列方式使物流费用最小!  
  现在的核心问题被我化到:讲7!次组合排列出来!  
  比如——我用三种情况举例一下!  
  a=1,b=2,c=3;  
  a=1,b=3,c=2;  
  a=2,b=1,c=3;  
  a=2,b=3,c=1;  
  a=3,b=1,c=2;  
  a=3,b=2,c=1;  
  象这样列举  
  编个程序能将7!种排列方式排出来  
  a=1,b=2,c=3,d=4,e=5,f=6,g=7  
  .......  
  a=7,b=6,c=5,d=4,e=3,f=2,g=1  
  我自己编的那个太复杂了,希望找一个简单的,请高手解决 问题点数:100、回复次数:6Top

1 楼liujingfu123(Oh_My_GoD)回复于 2006-03-04 19:01:10 得分 0

自己搞定咯!!!Top

2 楼cunsh(村少)回复于 2006-03-04 19:29:02 得分 20

/*  
  例4:将1到N的N个自然数排成一列,共有1*2*3……*N种不同的排列方法,如N=3时,有6种排列方案,分别为123,132,213,231,312,321.试编程序输出1到N的全部排列,假设N<10.  
  为了设计出由计算机输出1到N的全部排列程序,就必须寻找不同排列之间的规律.通过观察N=5(参见本例的运行结果)的排列情况,可以发现,如果把每个排列看作一个自然数,则所有排列对应的数是按从小到大的顺序排列,从当前的排列产生下一个排列时必然会造成某一位置上的数字变大,这一位置显然应该尽量靠右,并且在它左边位置上的数字保持不变,这就意味着这一位置变成的数字来自于它的右边,   并且变大的幅度要尽可能小,也就是说在它右边如有几个数同时比它大时,应该用其中最小的来代替它.由于这一位置是满足上述条件的最右边的一位,所以在它右边的所有数字按逆序排列,即在这些数字的右边没有一个大于它的数.程序中先从右至左找到第一个位置,该位置上的数比它右边的数小,这个位置就是所要找的满足上述条件的位置,然后再从右到左找到第一个比该位置上的数字大的数字所在的位置,将这两个位置上的数字交换,再将该位置右边的所有元素颠倒过来,即将它们按从小到大的顺序排列,就得到了下一个排列.  
   
   
  结果应该是:  
  Input   n:5  
  12345   12354   12435   12453   12534   12543   13245   13254   13425   13452    
  13524   13542   14235   14253   14325   14352   14523   14532   15234   15243    
  15324   15342   15423   15432   21345   21354   21435   21453   21534   21543    
  23145   23154   23415   23451   23514   23541   24135   24153   24315   24351    
  24513   24531   25134   25143   25314   25341   25413   25431   31245   31254    
  31425   31452   31524   31542   32145   32154   32415   32451   32514   32541    
  34125   34152   34215   34251   34512   34521   35124   35142   35214   35241    
  35412   35421   41235   41253   41325   41352   41523   41532   42135   42153    
  42315   42351   42513   42531   43125   43152   43215   43251   43512   43521    
  45123   45132   45213   45231   45312   45321   51234   51243   51324   51342    
  51423   51432   52134   52143   52314   52341   52413   52431   53124   53142    
  53214   53241   53412   53421   54123   54132   54213   54231   54312   54321  
   
     
   
  /*  
   
   
  #include<iostream>  
  using   namespace   std;  
   
  void   main(){  
        int   n;                                     //n个数字的排列;  
        cout<<"input:";  
        cin>>n;  
        int   *p=new   int[n];                   //数组保存各位数字;  
        for(int   i=0;i<n;i++)             //初始化为第一个排列;  
              p[i]=i+1;  
        do{  
              for(i=0;i<n;i++)             //输出排列中的数字  
                    cout<<p[i]<<"   ";  
              cout<<endl;              
              for(int   j=n-1;j>0;j--)       //从右向左;找要交换的位置1(j);  
                    if(p[j]>p[j-1])   break;  
              if(j==0)break;                   //找不到要交换的位置.退出do  
              j--;  
              for(int   k=n-1;k>j;k--)       //在位置1右边;从右向左;  
                                                  //找要交换的位置2(k);  
                    if(p[k]>p[j])break;  
              swap(p[k],p[j]);             //交换位置1和位置2的值;  
              //把位置1后边的所有位反序排列;  
              for(int   x=j+1,y=n-1;x<y;x++,y--)  
                    swap(p[x],p[y]);  
        }while(1);  
  delete   []p;  
  }  
   
   
  Top

3 楼duduhaha(三人行必有我师)回复于 2006-03-04 20:07:43 得分 80

#include   <stdio.h>    
   
  #define   MAX   7    
  int   used[MAX];    
  int   result[MAX];    
  int   N;    
   
  void   print(){    
     
  printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d\n   ",   result[0],result[1],result[2],result[3],result[4],result[5],result[6]);    
   
  }    
  void   proc(int   step)  
  {    
        int   i;    
        if(step   ==   N)    
              print();    
        else  
        {    
              for(i   =   0;   i   <   N;   i++)  
      {    
                      if(!used[i])  
      {    
                          used[i]   =   1;    
                          result[step]   =   i   +   1;    
                          proc(step   +   1);  
                          used[i]   =   0;    
      }    
      }    
        }    
  }    
   
  int   main(void)  
  {    
      N   =   7;  
      proc(0);    
  }    
  Top

4 楼mfs(玩命蚂蚁)回复于 2006-03-04 21:25:37 得分 0

我只会用7个for循环.:(Top

5 楼bluehacker88()回复于 2006-03-04 22:16:31 得分 0

#include   <stdlib.h>                   /*   For   _MAX_PATH   definition   */  
  #include   <stdio.h>  
  #include   <malloc.h>  
  #include   <memory.h>  
  #include   <string.h>  
   
   
  void   print(char   *str   ,   int   n   );  
   
  void   main()  
  {  
  char   s[]   =   {'a','b','c','\n','\0'   };  
  print(s,   3);  
  }  
  void   swap(char   &   a,char   &   b)  
  {  
  char   c;  
  c   =   a;  
  a   =   b;  
  b   =   c;  
  }  
   
  void   print(char   *str   ,   int   n   )  
  {  
  int   i;  
  if(   n   >   1)  
  {  
  for(   i   =   0   ;   i   <   n   ;   i++)  
  {  
  swap(str[i],str[n-1]);  
   
  print(str,n-1);  
   
  swap(str[i],str[n-1]);  
  }  
  }  
  else  
  {  
  printf("%s",str);  
  }  
  }Top

6 楼minsavage(帆野)回复于 2006-03-07 20:47:08 得分 0

markTop

相关问题

  • 一个小小的问题,各位高手帮帮忙!@#
  • 小小的数据库疑问,请帮帮忙
  • 一个小小的问题 高手帮帮忙 关于update
  • 一个小小的问题!多谢帮忙!
  • 一个小小的问题,请帮忙解释一下
  • 有一个小小的问题请大家帮忙
  • 小小的问题大家帮我看看
  • 有个小小的问题,高手们帮忙解决一下
  • 请高手帮助一下, 小小的问题!
  • 各位高手请指教!一个小小的问题!帮帮忙我给分!

关键词

  • 排列
  • 交换
  • 位置
  • 程序
  • print
  • max
  • result
  • 要交换
  • break
  • include

得分解答快速导航

  • 帖主:icrcapple
  • cunsh
  • duduhaha

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

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