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)个。也就是:
输入
输入的第一列有一个正整数,代表以下有多少组测试资料。
每组测试资料一列,含有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;
}