首页 > 代码库 > POJ 1392 Ouroboros Snake 欧拉回路
POJ 1392 Ouroboros Snake 欧拉回路
和那个编码是差不多的题,同样是分别用dfs和手写栈写了一遍,练手
这次写的时候比上次思路更加清晰了。
#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <climits>#include <string>#include <iostream>#include <map>#include <cstdlib>#include <list>#include <set>#include <queue>#include <stack>using namespace std;typedef long long LL;const int maxn = 1 << 16;int ans[maxn],n,k,now,lim;int s[maxn],snow[maxn],top,spos[maxn];bool hs[maxn];void dfs1() { memset(snow,0,sizeof(snow)); top = n - 1; ans[top] = 0; snow[0] = 0; top++; while(top < lim) { int w = ans[top - 1]; if(snow[w] == 2) { top--; snow[w] = 0; hs[w] = false; continue; } for(;snow[w] < 2;snow[w]++) { int vv = w & ((1 << (n - 1)) - 1); vv = (vv << 1) + snow[w]; if(!hs[vv]) { ans[top] = vv; snow[w]++; top++; hs[vv] = true; break; } } }}bool dfs(int now) { bool ret = false; if(now == lim) return true; for(int i = 0;i <= 1;i++) { int vv = ans[now - 1] & ((1 << (n - 1)) - 1); vv = (vv << 1) + i; if(!hs[vv]) { hs[vv] = true; ans[now] = vv; ret |= dfs(now + 1); } if(ret) break; } return ret;}void solve() { for(int i = 0;i < n;i++) ans[i] = 0; hs[0] = true; /* dfs(n); */ dfs1(); int ret = 0; for(int i = 0;i < n;i++) { ret = ret << 1; ret += ans[(k + i) % (1 << n)] % 2; } printf("%d\n",ret);}int main() { while(scanf("%d%d",&n,&k),n) { memset(hs,0,sizeof(hs)); now = 0; lim = (1 << n) + n - 1; solve(); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。