免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: fansfamily
打印 上一主题 下一主题

无聊就进来看看:关于排列数字的所有可能组合 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-01-07 21:04 |只看该作者
刚才回复了一个贴子,是用C++标准库中提供的 next_permutation() 算法来解决这一问题的,程序显得很简洁,可参考一下。

http://bbs.chinaunix.net/viewthr ... &extra=page%3D1

论坛徽章:
0
12 [报告]
发表于 2006-01-07 22:42 |只看该作者
曾经写过,P(m,n)和C(m,n)的程序,现在我一时半刻看不懂了:
stack可以自己写,也可以用stl里的,再改一下这个程序

  1. void Pmn(int m, int n){ // m >= n
  2.         int* visited = new int[m];
  3.         int s=-1, next, i;
  4.         for (i=0;i<n;i++) visited[i]=0;
  5.         stack<int> st(n);
  6.         while(1){
  7.                 next=-1;
  8.                 for(i=s+1;i<m;i++)
  9.                         if(visited[i]==0){
  10.                                 next=i;
  11.                                 break;
  12.                         }
  13.                 if(next ==-1){
  14.                         if(st.IsEmpty()) break;
  15.                         s=st.pop();
  16.                         visited[s]=0;
  17.                 }else{
  18.                         st.push(next);
  19.                         visited[next]=1;
  20.                         s=-1;
  21.                         if(st.IsFull()){
  22.                                 //I have got it in the stack st
  23.                                 s=st.pop();
  24.                                 visited[s]=0;
  25.                         }
  26.                 }
  27.         }
  28.         delete[] visited;
  29. };

  30. void Cmn (int m, int n){ // m >= n
  31.         stack<int> st(n);
  32.         int next, last=-1;
  33.         while(1){
  34.                 next=++last;
  35.                 if(next==m)
  36.                         last=st.pop();
  37.                 else{
  38.                         st.push(next);
  39.                         if(st.IsFull()){
  40.                                 //I have got it in the stack st
  41.                                 if(st[0]= m-n)
  42.                                         break;
  43.                                 last=st.pop();
  44.                         }
  45.                 }
  46.         }
  47. };
复制代码

论坛徽章:
0
13 [报告]
发表于 2006-01-09 07:27 |只看该作者
有一个单纯的想法,
若是现在的排列是1234,
可以直接求下一个比它大的数是1243
然后是1324, 1342, 。。。


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main (void)
  4. {
  5.         /* 排列有n项 */
  6.         int n = 4;

  7.         int i, j, k, l, ai;
  8.         int a[20]; // 我想真的用起来不会超过20把
  9.        
  10.         for (i = 0; i < 20; i++) a[i] = i;
  11.        
  12.         ai = 0;
  13.         while (1) {
  14.                 printf("%4d\t", ++ai);
  15.                 for (l = 1; l <= n; l++) printf("%3d", a[l]);
  16.                 printf("\n");

  17.                 i = n-1;
  18.                 while (a[i] > a[i+1] && i > 0) i--;
  19.                 if (i == 0) break;
  20.                
  21.                 j = i;
  22.                 while (a[i] < a[j+1] && j < n) j++;

  23.                 k = a[i];
  24.                 a[i] = a[j];
  25.                 a[j] = k;

  26.                 for (l = i+1; l <= (i+1+n)/2; l++) {
  27.                         k = a[l];
  28.                         a[l] = a[n+1+i-l];
  29.                         a[n+1+i-l] = k;
  30.                 }
  31.         }
  32.         return 0;
  33. }
复制代码

论坛徽章:
0
14 [报告]
发表于 2013-10-06 00:40 |只看该作者
寻找能看懂图的高手  加我QQ2220174

未命名.jpg (261.56 KB, 下载次数: 25)

未命名.jpg

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
15 [报告]
发表于 2013-10-06 16:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
16 [报告]
发表于 2013-10-08 16:20 |只看该作者
牛!回复 4# RobinHoo



   

论坛徽章:
0
17 [报告]
发表于 2013-10-08 16:32 |只看该作者
还有一个简单的思路,直接从4321最大的数往下遍历到1234,遇到有不是这四个数的或者有重复的跳过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP