这个题以前一直没弄明白...
相当于有$2^n-1$个点,$2^n$条边
然后求欧拉回路
可以dfs也可以迭代
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int k,maxp; int flag[5006]; int a[5006],num; void print() { for(int i=num-k+2;i<=num;++i) printf("%d",a[i]); for(int i=1;i<=num-k+1;++i) printf("%d",a[i]); exit(0); } void dfs(int now,int len) { if(len==maxp+1) { print(); return ; } if(flag[now]) return ; flag[now]=1; a[++num]=now&1; //printf("now=%d len=%d ",now,len); int temp=((now&(~(1<<(k-1))))<<1); dfs(temp,len+1); dfs(temp|1,len+1); flag[now]=0; --num; } int main(){ //freopen("2.txt","w",stdout); scanf("%d",&k); maxp=(1<<k); printf("%d ",maxp); dfs(0,1); //while(1); return 0; }
#include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> #include <algorithm> #define ll long long #define rint register int #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; inline void read(int &x) { x=0; char q=getchar(); while(q<'0'||q>'9') q=getchar(); while(q>='0'&&q<='9') x=x*10+q-'0',q=getchar(); } int n,len,maxp; bool vis[(1<<20)+1000]; int main(){ rint i,j; read(n); len=(1<<n); maxp=(1<<n)-1; //printf("%d ",len); int now=maxp; vis[maxp]=1; for(i=n+1;i<=len;++i) { now=((now<<1)&maxp); if(!vis[now]) { vis[now]=1; printf("0"); } else { ++now; vis[now]=1; printf("1"); } } for(i=1;i<=n;++i) printf("1"); }