uva 729

Q729:汉明距离问题

给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
                            甲XOR B = 1 0 0 1 1 1 1 1 0 0

你的任务是给你字串的长度(N)及所要求的Hamming distance(H),请你输出所有这样的2元字串,也就是长度为N的二元字串,且恰好有H个1的字串。由数学我们得知这样的字串共有C(N,H)个。也就是:\begin{displaymath}{N!} \over {(N-H)! H!}\end{displaymath}

输入

输入的第一列有一个正整数,代表以下有多少组测试资料。

每组测试资料一列,含有2个正整数N、H(1 <= H <= N <= 16)。N代表字串的长度,H代表Hamming distance。

请参考样例输入。

产量

对每一组测试资料,输出所有长度为N,且Hamming distance为H的二元字串,并由小到大输出

意思就是按字典序输出长度为N含有H个一的0,1串

直接枚举

1水题错的很冤枉

2理解错题意了我以为输出的子串相邻两个Hamming distance位H;

http://www.nocow.cn/index.php/%E9%A6%96%E9%A1%B5欢迎大家前来壮大

#include <iostream>

using namespace std;
int a[]= {1,1<<1,1<<2,1<<3,1<<4,1<<5,1<<6,1<<7,1<<8,1<<9,1<<10,1<<11,1<<12,1<<13,1<<14,1<<15,1<<16};
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,h;
        cin>>n>>h;
         int l=(1<<n)-1;
        for(int i=0; i<=l; i++)
        {
            int sum=0;
            for(int j=n-1; j>=0; j--)
                if(i&a[j])
                    sum++;
            if(sum==h)
                for(int j=n-1; j>=0; j--)
                {
                    if(i&a[j])
                        cout<<'1';
                    else
                        cout<<'0';
                    if(j==0)
                        cout<<endl;
                }
        }
        if(t)
            cout<<endl;
    }
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值