UVA 729 Hamming 距离问题

本文介绍了一种不使用STL库函数next_permutation的手动实现全排列与受限排列的方法。通过递归的方式生成所有可能的排列组合,并针对受限排列的情况进行了特别处理,确保了每个元素的使用次数不超过其出现次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同上一题类似,全排列A与排列C的区别

没有用STL的 next_permutation

#include<iostream>
#include<cstdio>
#include<cstring>
#include<memory>
#include<queue>
#include<algorithm>
#include<string>
#include<cmath>
#include<stack>
using namespace std;

///
int N, H;
int p[20];
int A[20];
void print_permutation(int n, int *A, int *p, int cur)
{
	int i, j;
	if (cur == n)
	{
		for (i = 0; i < n; i++)
			cout << A[i];
		cout << endl;
	}
	else for (i = 0; i < n; i++)
	{
		if (!i || p[i] != p[i - 1])
		{
			int c1 = 0, c2 = 0;
			for (j = 0; j < cur; j++)
			{
				if (A[j] == p[i])
					c1++;
			}
			for (j = 0; j < n; j++)
			{
				if (p[i] == p[j])
					c2++;
			}
			if (c1 < c2)
			{
				A[cur] = p[i];
				print_permutation(n, A, p, cur + 1);
			}
		}
	}
}
int main()
{
	///
	int i, j, k;
	int nCases;
	cin >> nCases;
	while (nCases--)
	{
		cin >> N >> H;
		memset(p, 0, sizeof(p));
		j = N - 1;
		for (i = H; i > 0; i--)
			p[j--] = 1;
		print_permutation(N, A, p, 0);
		if (nCases != 0)
			cout << endl;
	}


	
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值