题目
鼓的主要部件是M周围的传感器。每个传感器有两种工作状态:开关,分别用1和0表示。
显然,沿顺时针方向连续检查K个传感器,从不同位置可以得到M个长度为K的01串。
Vani知道这个M个01串应该是不一样的。而且鼓的设计非常精确,M可能的最大值。
现在Vani已经知道了K(2<=K<=11)值,他希望你能找到M值,并给出字典序最小的传感器排列方案。
你输出的第一个字和最后一个字相邻。
例如,输入3,输出8 0010111,8个01串,分别是000、001、010、101、011、110和100
思路来源
http://hzwer.com/4136.html
题解
枚举后面填0还是填1,移位暴搜,到mx层时说明无重复,
而且由于每个值只能从两个值转移到两个值,所以出入度相等,是偶数,
说明这是欧拉图,对欧拉图来说,从任何一点出发,都有解,是一个环
从0开始的答案一定是最小的,先搜0再搜1字典序一定是最小的,
简洁的代码令人惊叹啊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; }