题目
鼓的主要元件是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。
显然,从不同的位置出发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。
Vani知道这M个01串应该是互不相同的。而且鼓的设计很精密,M会取到可能的最大值。
现在Vani已经了解到了K(2<=K<=11)的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。
你输出的串的第一个字和最后一个字是相邻的。
如,输入3,输出8 00010111,8个01串分别是000、001、010、101、011、111、110和100
思路来源
题解
枚举后面填0还是填1,移位暴搜,到mx层时说明无重复,
且由于每个值仅能从两个值转移而来,且转移到两个值去,出入度相等且为偶数,
说明这是一个欧拉图,对于欧拉图来说,从任何点出发,都有解,是一个环
那从0出发的答案一定是最小的,先搜0再搜1字典序一定是最小的,
扫描二维码关注公众号,回复:
8873357 查看本文章
代码简洁的令人惊叹啊ORZ
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=13;
int n,mx,ans[1<<N],bit[N];
bool used[1<<N];
bool dfs(int x,int v)
{
if(used[v])return 0;
if(x==mx)return 1;
ans[x]=v&1;
used[v]=1;
if(dfs(x+1,(v<<1)&(mx-1)))return 1;
if(dfs(x+1,(v<<1|1)&(mx-1)))return 1;
used[v]=0;
return 0;
}
int main()
{
bit[0]=1;
for(int i=1;i<=11;++i)
bit[i]=bit[i-1]*2;
scanf("%d",&n);
mx=bit[n];
dfs(1,0);
printf("%d ",mx);
for(int i=1;i<n;++i)putchar('0');
for(int i=1;i<=mx-n+1;++i)printf("%d",ans[i]);
puts("");
return 0;
}