• 太鼓达人(欧拉图——暴力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

     

    越努力 越幸运
  • 相关阅读:
    超图 wpf地图控件加载地图
    MySql常用内容
    超图资料下载与环境安装
    超图SampleCode运行须知
    英语感叹词
    英语之妻子,老婆
    Pycharm设置
    yizhihx ubuntu config
    Ubuntu之网易云音乐无法启动
    linux之错误输出重定向
  • 原文地址:https://www.cnblogs.com/OI-zzyy/p/11177764.html
Copyright © 2020-2023  润新知