——by A Code Rabbit
Description
两个二进制数序列相异或,出来一个新的二进制数序列,这个新的序列中有几个1,就表示两个二进制数序列之间的Hamming距离。
输入N和H,输出长度为N的序列中,这个玩意儿Hamming距离为H的序列,并且输出要按字典序输出。
Types
Brute Force :: Elementary Skills
Analysis
可爱的题目。
和00...0的异或出H个1的序列,明显就是有几个1的序列……
所以求得就是有H个1,长度为N的序列。
更可爱的是,
题目好像为了规范输出而提出,按字典序输出。
这下好玩了,我们把有H个1,长度为N的序列,
看成H个1,N – H个0组成的一个序列。
然后啊,这个序列的所有全排列,正好是题目要求的所有序列……
顺序输出,正好是字典序输出。
由于这个可爱的字典序,可以用next_permutation( )轻松搞定了。
Solution
// UVaOJ 729
// The Hamming Distance Problem
// by A Code Rabbit
#include <algorithm>
#include <cstdio>
using namespace std;
const int LIMITS = 18;
int t;
int n, h;
char str[LIMITS];
bool is_first = true;
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &h);
for (int i = 0; i < n; ++i) {
str[i] = n - i <= h ? '1' : '0';
}
str[n] = '\0';
if (is_first) {
is_first = false;
} else {
printf("\n");
}
do {
puts(str);
} while (next_permutation(str, str + n));
}
return 0;
}
参考资料:无