太鼓达人(欧拉图——暴力dfs)

题干:

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

题解:

  这道题水得我头皮发麻。。。

  这道题实际上是将 k-1 位的二进制数看做点,k位的二进制数看成边,并且连接两个点的边就是将这两个点的权像这样联系起来:

 

  好了,它对这道题没有任何帮助。。。(一张无向图为欧拉图,当且仅当无向图连通,并且每个点的度数都是偶数。它对一笔画问题有较好效果)。

  这道题就是一道比较朴素的dfs题,题干中说以每一位向后数(1<<k)-1 个数,它所构成的二进制数均唯一。我们就可以以0为起点,不断左移一位并在 加一 或 不加一 中选择,边界直接输出即可。(长度一定是 1<<k )。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #define $ 111111
 5 #define maxx 1<<k
 6 using namespace std;
 7 int m,k,n,zzyy,judge[$],up;
 8 char sta[$];
 9 inline void dfs(int x,int sum){
10     judge[x]=1;
11     for(register int i=0;i<=1;++i){
12         int to=((zzyy&x)<<1)+i;
13         if(to==0&&maxx==sum){
14             for(register int i=1;i<=maxx;++i)
15                 if(i<=k) putchar('0');
16                 else     putchar(sta[i]);
17             exit(0);
18         }
19         if(!judge[to]){
20             sta[++up]='0'+i;
21             dfs(to,sum+1); up--;
22         }
23     }
24     judge[x]=0;
25 }
26 signed main(){
27     scanf("%d",&k); up=k;
28     printf("%d ",maxx);
29     zzyy=(1<<(k-1))-1;
30     dfs(0,1);
31 }
View Code

 

越努力 越幸运
原文地址:https://www.cnblogs.com/OI-zzyy/p/11177764.html