UVA 729 - The Hamming Distance Problem

这道题前面做了这么多铺垫,然后给我一个长为N的序列,其中有H个1,剩余的是0,要我们按

字典序输出该序列的可重集排列,因为昨天刚学会用C++的库函数,我先用Next_permutation函

数写了一遍,代码很简洁。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;

int num[20];
int main()
{
int T;
scanf( "%d", &T);
int len, n;
while( T --)
{
scanf( "%d%d", &len, &n);
for( int i = 0; i < len; i ++)
{
if( i < len - n) num[i] = 0;
else num[i] = 1;
}
do
{
for( int i = 0; i < len; i ++)
printf( "%d", num[i]);
printf( "\n");
}while( next_permutation( num, num + len) );
if( T > 0) printf( "\n");
}
return 0;
}

之后写了一遍不用库函数的:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 20

int P[MAXN], A[MAXN], N, H;

void print_permutation( int N, int *P, int *A, int cur)
{
if( cur == N){
for( int i = 0; i < N; i ++)
printf( "%d", A[i]);
printf( "\n");
}
else for( int i = 0; i < N; i ++)
if( !i || P[i] != P[i - 1])
{
int c1 = 0, c2 = 0;
for( int j = 0; j < cur; j ++) if( A[j] == P[i]) c1 ++;
for( int j = 0; j < N; j ++) if( P[i] == P[j]) c2 ++;
if( c1 < c2)
{
A[cur] = P[i];
print_permutation( N, P, A, cur + 1);
}
}
}

int main()
{
int T;
scanf( "%d", &T);
while( T --)
{
scanf( "%d%d", &N, &H);
for( int i = 0; i < N; i ++)
{
if( i < N - H) P[i] = 0;
else P[i] = 1;
}
print_permutation( N, P, A, 0);
if( T > 0) printf( "\n");
}
return 0;
}



你可能感兴趣的:(uva)