HDU 2894 DeBruijin (欧拉回路)

来源:互联网 发布:知豆可以开多少公里 编辑:程序博客网 时间:2024/06/01 09:16

题目地址
题意:中文不解释
思路:第一个输出无疑就是2^n,然后复杂的就是输出序列,下图就是一个n为3的时候的情况,因为每次都要旋转一位,我们可以把这个抽象成一个节点个数为2^(n-1)的图,对应2^(n-1)个n-1位二进制数,当前的节点代表的是二进制数字为k,他要连向代表数(k<<1)&(1<

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#define LL long long #define N 1<<15#define M 200010#define inf 0x3f3f3f3fusing namespace std;const LL mod = 1e9 + 7;const double eps = 1e-9;int n;bool vis[N];stack<int> s;void dfs(int num) {    int num1 = (num << 1)&((1 << n) - 1);//去除最高位,向左移1位,最低位补0    int num2 = num1 + 1;//去除最高位,向左移1位,最低位补1    if (!vis[num1]) {        vis[num1] = true;        dfs(num1);        s.push(0);    }    if (!vis[num2]) {        vis[num2] = true;        dfs(num2);        s.push(1);    }}int main() {    cin.sync_with_stdio(false);    while (cin >> n) {        memset(vis, false, sizeof(vis));        while (s.size()) {            s.pop();        }        dfs(0);        cout << (1 << n) << " ";        for (int i = 1; i < n; i++) {            cout << 0;        }        while (s.size() >= n) {            cout << s.top();            s.pop();        }        cout << endl;    }    return 0;}
原创粉丝点击