我摊牌了,我只想搜他丫的
这道题让我想起了数电课上那个纽扣寄存器 , 一共有pow(2,k)种做法,数电课上的做法是对于长度为k的串,末尾取反加到头部就可以构造出pow(2,k)种不同的串
但是这道题需要输出字典序最小的方案,我看了一下最多也就2048种情况,果断暴力
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2049;
int k, ed;
int flag[maxn], ans[maxn];
int dfs(int now, int dep) {
if (dep == ed + 1) {
int sto = now;
for (int i = 1; i < k; i++) {
sto &= ((1 << (k - 1)) - 1);
sto <<= 1;
if (flag[sto])
return 0;
}
return 1;
}
int sto = now;
sto &= ((1 << (k - 1)) - 1);
sto <<= 1;
if (!flag[sto]) {
flag[sto] = 1;
ans[dep] = 0;
if (dfs(sto, dep + 1))
return 1;
flag[sto] = 0;
}
sto |= 1;
if (!flag[sto]) {
flag[sto] = 1;
ans[dep] = 1;
if (dfs(sto, dep + 1))
return 1;
flag[sto] = 0;
}
return 0;
}
int main() {
cin >> k;
ed = pow(2, k);
flag[0] = 1;
dfs(0, k + 1);
cout << ed << " ";
for (int i = 1; i <= ed; i++) {
cout << ans[i];
}
}
数电课上的格雷码233