UVA 729 - The Hamming Distance Problem

5988 ワード

この問題の前にこんなにたくさんの敷物を作って、それから私に1つの長いNのシーケンスをあげて、その中にH個の1があって、残りは0で、私達に
辞書の順序はこのシーケンスの再セット可能な配列を出力して、昨日C++のライブラリ関数を使うことをマスターしたばかりなので、私は先にNext_を使います牙列缺损
数回書きましたが、コードが簡潔です.
#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( "
");
}while( next_permutation( num, num + len) );
if( T > 0) printf( "
");
}
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( "
");
}
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( "
");
}
return 0;
}