zoukankan      html  css  js  c++  java
  • hdu 2894

    刚刚看到这个题感觉挺复杂的~~~因为它还要输出字典序;

    很容易知道对于任意的k,第一个输出总是1<<k;

    而对于第二个嘛,不管怎么样,前k个元素总是k个0;

    然后取前k-1个数,加上0或者1可以再变成两个数,如果这些数没有被访问就添加进去;

    这样就可以保证取得的结果不会重复或者漏掉!

    另外,要按照字典序找出最小的,只需要每次DFS时,先添加0,再添加1就可以了;

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int a[1<<13],n,p;
     5 bool vis[1<<13];
     6 void dfs(int x)
     7 {
     8     int n1=(x<<1)&((1<<n)-1);
     9     int n2=n1+1;
    10     if(!vis[n1])
    11     {
    12         vis[n1]=1;
    13         dfs(n1);
    14         a[++p]=0;
    15     }
    16     if(!vis[n2])
    17     {
    18         vis[n2]=1;
    19         dfs(n2);
    20         a[++p]=1;
    21     }
    22 }
    23 int main()
    24 {
    25     while(scanf("%d",&n)!=EOF)
    26     {
    27         memset(vis,0,sizeof vis);
    28         p=0;
    29         dfs(0);
    30         printf("%d ",1<<n);
    31         for(int i=1;i<n;i++) printf("0");
    32         for(int i=p;i>=n;i--) printf("%d",a[i]);
    33         puts("");
    34     }
    35     return 0;
    36 }
    View Code
  • 相关阅读:
    hibernate
    杨辉三角
    查看端口号
    一个线程同步问题的例子
    SQL关系数据库设计三大范式
    C#OpenFileDialog的使用
    莫队算法
    蒟蒻已知的高能数学公式
    C++ 产生随机数
    C++ 输出小数点后 n 位
  • 原文地址:https://www.cnblogs.com/yours1103/p/3312401.html
Copyright © 2011-2022 走看看