您的位置:首页 > 其它

bzoj 3033: 太鼓达人 欧拉图+dfs

2017-10-09 20:14 267 查看

题意

  鼓的主要元件是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。显然,从不同的位置出发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。Vani知道这M个01串应该是互不相同的。而且鼓的设计很精密,M会取到可能的最大值。现在Vani已经了解到了K的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。

K<=11

分析

因为这是一个连通图且每个点入度等于出度,所以这必然是一个欧拉图。然后直接dfs找欧拉回路就好了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;

int n,bin[20],vis[3005],ans[3005];

bool dfs(int x,int y)
{
vis[x]=1;
if (x==bin
) return 1;
if (!vis[(x<<1)&bin
])
{
ans[y]=0;
if (dfs((x<<1)&bin
,y+1)) return 1;
}
if (!vis[(x<<1|1)&bin
])
{
ans[y]=1;
if (dfs((x<<1|1)&bin
,y+1)) return 1;
}
vis[x]=0;
return 0;
}

int main()
{
scanf("%d",&n);
bin[0]=1;
for (int i=1;i<=n;i++) bin[i]=bin[i-1]*2;
bin
--;
dfs(0,1);
printf("%d ",bin
+1);
for (int i=1;i<=n;i++) putchar('0');
for (int i=1;i<=bin
+1-n;i++) putchar(ans[i]+'0');
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: