资讯详情

BZOJ3033 太鼓达人(dfs暴搜)

题目

鼓的主要部件是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; }

标签: 传感器dfs

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台