【搜索】传感器 @upcexam6023
时间限制: 1 Sec 内存限制: 128 MB
题目描述
SR最近新买了一款电子桌游
这个玩具内部是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。显然,从不同的位置触发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。SR知道这M个01串应该是互不相同的。
而且这个桌游的设计很静谧,M会取到最大的可能值。现在SR已经了解到了K的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。
输入
一行一个整数K
输出
一个整数 M 和一个二进制串,由一个空格分隔。表示可能的最大的 M,以及字典序最小的排布方案,字符 0 表示关, 1 表示开。你输出的串的第一个字符和最后一个字符是相邻的
样例输入
3
样例输出
8 00010111
提示
对于100%的数据 2<=K<=11
分析样例可以按顺序得到
000
001
010
101
011
111
110
100
所以可以考虑从000开始dfs
每次对于当前的数x
dfs(x<<1)
dfs((x|1)<<1)
当然前提是没有访问过
如果两条支路都访问过了,说明形成了一个环
此时判断递归层数是否等于
#define FILE() freopen("../../in.txt","r",stdin)
#include <bits/stdc++.h>
using namespace std;
int ans[2050],vis[2050],n,cel,modi;
void dfs(int sta,int fl) {
int nex = sta<<1;
vis[sta] = 1;
if(modi)ans[fl] = sta&(1<<(n-1))?1:0;
int flag = 0;
if(!vis[nex%cel]) {
dfs(nex%cel,fl+1);
if(!modi)return;
flag =1;
}
if(!vis[(nex|1)%cel]) {
dfs((nex|1)%cel,fl+1);
if(!modi)return;
flag =1;
}
if(flag==0&&fl==(1<<n)-1){
modi = 0;
}
vis[sta] = 0;
}
int main() {
// FILE();
scanf("%d",&n);
cel = 1<<n;
modi =1;
dfs(0,0);
printf("%d ",1<<n);
for(int i=0;i<(1<<n);i++){
printf("%d",ans[i]);
}
puts("");
return 0;
}