现在的位置: 首页 > 综合 > 正文

UVa729 – The Hamming Distance Problem(全排列)

2018年12月20日 ⁄ 综合 ⁄ 共 892字 ⁄ 字号 评论关闭

给2个相同长度的2元字串,比较他们在相同位置的内容,并计算各位置内容不一样的总数,我们称该数為它们之间的Hamming distance。这任务可以经由对字串中各相同位置字元作XOR的运算或者做2进位的相加(但不进位)而得到。以下的例子為2个长度為10的2元字串A、B经过XOR运算。可以看出共有6个1,所以其Hamming distance為6。
                               A      0 1 0 0 1 0 1 0 0 0
                               B      1 1 0 1 0 1 0 1 0 0
                            A XOR B = 1 0 0 1 1 1 1 1 0 0
你的任务是给你字串的长度(N)及所要求的Hamming distance(H),请你输出所有这样的2元字串,也就是长度為N的二元字串,且恰好有H个1的字串。由数学我们得知这样的字串共有C(N,H)个。也就是:
    N!
─────
(N-H)! H!
Input
输入的第一列有一个正整数,代表以下有多少组测试资料。
每组测试资料一列,含有2个正整数N、H(1 <= H <= N <= 16)。N代表字串的长度,H代表Hamming distance。
请参考Sample Input。
Output
对每一组测试资料,输出所有长度為N,且Hamming distance為H的二元字串,并由小到大输出。测试资料间请空一列。
Sample Input
2

4 2

3 2
Sample Output
0011
0101
0110
1001
1010
1100

011
101
110

code:

#include <stdio.h>

int a[32];
int main()
{
    int T, n, h;
    int i, tot, x, j;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&h);
        for(i=1;i<= 1<<n; i++)
        {

            for(j=0,x=i,tot=0;j<n;j++)
            {
                a[j] = x % 2;
                tot +=a[j];
                x /=2;
            }
            if(tot == h)
            {
                for(j=n-1; j>=0; j--) printf("%d",a[j]);
                printf("\n");
            }
        }
        if(T!=0) printf("\n");
    }
    return 0;
}

抱歉!评论已关闭.