首页 > 其他 > 详细

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

时间:2019-07-12 18:27:02      阅读:112      评论:0      收藏:0      [点我收藏+]

题干:

  鼓的主要元件是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

 

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

原文:https://www.cnblogs.com/OI-zzyy/p/11177764.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!