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 }