问题
http://hihocoder.com/problemset/problem/1182?sid=784688
解法
构造有向图,每条边表示0~
2n−1
中的一个数,则求有向图的欧拉回路。
使用Fleury算法 后path倒序输出才是结果。
#include <bits/stdc++.h>
using namespace std;
enum{maxn = 1<<15};
int G[maxn][2];
bool visit[maxn][2];
int path[maxn];
int pathNum;
int n;
void buildG()
{
int m = 1<<(n-1);
for (int i=0; i<m; ++i)
{
G[i][0] = (i<<1|0) & (m-1);
G[i][1] = (i<<1|1) & (m-1);
}
}
void dfs(int u)
{
for (int i=0; i<2; ++i)
{
if (!visit[u][i])
{
int v = G[u][i];
visit[u][i] = true;
dfs(v);
}
}
path[pathNum++] = u;
}
int main()
{
memset(visit, 0, sizeof(visit));
scanf("%d", &n);
buildG();
pathNum =0;
dfs(0);
for (int i=pathNum-2; i>=0; --i)
{
printf("%c", path[i]&0x01? '1':'0');
}
printf("\n");
return 0;
}