生成所有排列

void swap(char *a, char *b)
{
   char t = *a;
   *a = *b;
   *b = t;
}
void permutation(char *c, int l, int r)//[l,r)
{
   if (l == r)
   {
      cout<<c<<endl;
      return;
   }

   for (int i = l; i < r; ++i)
   {
      //cout<<c[i]; 
      swap(&c[l], &c[i]); 
	  permutation(c, l+1, r);   
	  swap(&c[l], &c[i]);   
   }
   
}

生成可重排列(先对in排序)

void permutation(const char *in, char *out, int l, int r)//[l,r)
{
    int i, j, k, c1, c2;
	if (l == r)
	{    
		cout<<out<<endl;	
	}
    else
	for (i = 0; i < r; ++i)
	{
	    c1 = 0; 
	    c2 = 0;
	    for (k = 0; k < l; ++k)
	    {
	       if (in[i] == out[k])
	       {
	          ++c1;
	       }
	    }
		for (k = 0; k < r; ++k)
		{
			if (in[i] == in[k])
			{
				++c2;
			}
		}
	    if (c1 < c2 && (!i || in[i-1] != in[i]))
	    {
	      out[l] = in[i];
	      permutation(in, out, l+1, r);
	    }
		
	}

}
非递归生成
     int len = strlen(in);   
     sort(in, in+len);
     do 
     {
         printf("%s\n", in);
     } while (next_permutation(in, in+len));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值