next_permutation在排列类问题中的应用

之前以为递归法或者模拟n进制法可以很有效果
现在在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进行全排列,即可
#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就行了,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值