之前以为递归法或者模拟n进制法可以很有效果
现在在csdn 数据结构版面上又发现了更好的方法
细细一看原来都是hw121的方法
很是敬佩
stl中的这个函数对解决排列组合可以提高很多效率:
可以得到按照字典顺序的下一个.
问题1 打印a b c d e 的全排列
使用next_permutation的关键是,先要sort,否则会导致结果不全.
对于有重复的也可以
真是不错
问题2 特定限制的全排列
例如有3行4列的非负整数矩阵,如下:
1 2 3 4
5 6 7 8
9 10 11 12
约束条件是:排列的结果中必须保证——
1在2的前面、2在3的前面,3在4的前;
5在6的前面、6在7的前面,7在8的前;
9至12依次类推;
而且1、5、9谁在前谁在后不受任何限制,以此类推。
这样,对该矩阵进行某种特定的复杂运算后得到多个排列(可能有重复的),比如其中的一个排列如下:
1 5 2 6 9 3 10 7 11 8 12 4
现在问题是:如何对此排列实施随机性的变换,使其仍然符合上述约束条件并且和原来的排列不一样?
方法是
建立一个数组a,对应每个元素的行号
一个数组b保存该行使用到的列
对a进行全排列,即可
#include <stdio.h>
#include <algorithm>
using namespace std;

void main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int row[12], count = 0;
for(int r = 0; r < 3; r++)
for(int i = 0; i < 4; i++)
row[r*4+i] = r;
do {
int i, b[3];
for(i = b[0] = b[1] = b[2] = 0; i < 12; i++)
printf("%2d ", a[ row[i] ][ b[row[i]]++ ] );
printf(" ");
count++;
}while( next_permutation(row, row + 12) );
printf("count=%d ",count);
}
这样的方法
对于其他类型的限制,比如1 2 3 4 5 全排,但是 3 4 不相邻就很容易了.
直接在a[i] = 3 时判断a[i+1]是否等于 4就行了,
现在在csdn 数据结构版面上又发现了更好的方法
细细一看原来都是hw121的方法
很是敬佩
stl中的这个函数对解决排列组合可以提高很多效率:
可以得到按照字典顺序的下一个.
问题1 打印a b c d e 的全排列
使用next_permutation的关键是,先要sort,否则会导致结果不全.
#include <stdio.h>
#include <algorithm>
using namespace std;

void main()
{
char str[8] = "3124";
int len = strlen(str); 
sort(str, str+len );
do {
printf("%s ",str);
}while( next_permutation(str,str + len) );
}













对于有重复的也可以
真是不错
问题2 特定限制的全排列
例如有3行4列的非负整数矩阵,如下:
1 2 3 4
5 6 7 8
9 10 11 12
约束条件是:排列的结果中必须保证——
1在2的前面、2在3的前面,3在4的前;
5在6的前面、6在7的前面,7在8的前;
9至12依次类推;
而且1、5、9谁在前谁在后不受任何限制,以此类推。
这样,对该矩阵进行某种特定的复杂运算后得到多个排列(可能有重复的),比如其中的一个排列如下:
1 5 2 6 9 3 10 7 11 8 12 4
现在问题是:如何对此排列实施随机性的变换,使其仍然符合上述约束条件并且和原来的排列不一样?
方法是
建立一个数组a,对应每个元素的行号
一个数组b保存该行使用到的列
对a进行全排列,即可




















这样的方法
对于其他类型的限制,比如1 2 3 4 5 全排,但是 3 4 不相邻就很容易了.
直接在a[i] = 3 时判断a[i+1]是否等于 4就行了,