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
原文地址:https://www.cnblogs.com/yours1103/p/3312401.html