Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877535
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-07-15 13:40:12


点击(此处)折叠或打开

  1. 这是一道典型的全排列问题。可以用STL的next_permutation()函数,标准库全排列next_permutation()的返回值:bool类型
  2. 分析next_permutation函数执行过程:
  3. 假设数列 d1,d2,d3,d4……范围由[first,last)标记,调用next_permutation使数列逐次增大,这个递增过程按照字典序。

  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. int main()
  8. {
  9.     int a[] = {1,2,3};
  10.     do
  11.     {
  12.         cout << a[0] << " " << a[1] << " " << a[2] << endl;
  13.     }
  14.     while (next_permutation(a,a+3));//while放在前面的话 要考虑如何输出第一个 1 2 3,因为数组一直在递增
  15.     
  16.     return 0;
  17. }


点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <stdio.h>
  5. using namespace std;


  6. char e[10];

  7. //首先从右边找到第一个相邻"逆序对",e[i]<e[j]
  8. int argument_a(int len)
  9. {
  10.     int i;
  11.     for(i=len-2;i>=0;--i) //i位直接与其前一位相比较
  12.     {
  13.         // 因此i的左界为len为元素个数i+1,即为len-2+1
  14.         if(e[i]<e[i+1] || i==0 )
  15.         {
  16.             break;
  17.         }
  18.     }
  19.     return i;
  20. }

  21. //然后再重新从右边起找出第一个比那个"逆序对"的较小者,要大的数
  22. int argument_b(int len, int parter )
  23. {
  24.     int i;
  25.     for( i=len-1; i>=0;--i) //i是不可能为0,因为e[i](parter)<e[i+1],我们是从后面开始扫描
  26.     {
  27.         if( e[i]> parter|| i== 0 ) // 在连续的数组比较中的一种较为固定的控制,伪监视哨
  28.         {
  29.             break;
  30.         }
  31.     }
  32.     return i;
  33. }

  34. void swap( char &a, char &b )
  35. {
  36.     int temp= a;
  37.     a= b;
  38.     b= temp;
  39. }
  40.   
  41. void reverse(int front, int rear)
  42. {
  43.     int i=front, j=rear-1;
  44.     while(i<=j)
  45.     {
  46.         swap( e[i], e[j] );
  47.         ++i, --j;
  48.     }
  49. }

  50. //判断是否最大的那个数
  51. bool is_end( int len )
  52. {
  53.     int i;
  54.     for( i= len- 2; i>= 0; --i )
  55.     {
  56.         if( e[i]< e[i+ 1] )
  57.         {
  58.             return false;
  59.         }
  60.     }
  61.     if(i==-1) // 说明一直遍历到了最前端
  62.     {
  63.         return true;
  64.     }
  65.     return false;
  66. }

  67. bool next(int len )
  68. {
  69.     if( is_end(len) )
  70.     {
  71.         return false;
  72.     }
  73.     else
  74.     {
  75.         int i= argument_a(strlen(e));
  76.         int j= argument_b(strlen(e),e[i]);
  77.         swap(e[i], e[j]); //交换
  78.         reverse(i+1, 4); //倒转
  79.         return true;
  80.     }
  81. }
  82. int cmp( const void *a, const void *b )
  83. {
  84.     return *( char * )a- *( char * )b;
  85. }

  86. int main()
  87. {
  88.     while(scanf( "%c %c %c %c", &e[0], &e[1], &e[2], &e[3])!= EOF)
  89.     {
  90.         qsort(e, 4, sizeof(char),cmp); //先拿到第一个,如:1234 or 1234Aa
  91.         do
  92.         {
  93.             cout << e[0] << " " << e[1] << " " << e[2] << " " << e[3]<< endl;
  94.         }
  95.         while(next(4));
  96.     }

  97.     return 0;
  98. }

 
 
 
 
 
 
阅读(1296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~