题解:UVA10040 Ouroboros Snake
环形问题很容易想到回路。
考虑建立图论模型(技巧点 1),我们将 (x<<1+w)&cover,其中 1<<(n-1)-1,用于提取末尾的
这样建好图之后,跑出字典序最小的欧拉回路,在过程中倒序记录所有的
:::success[实现(仅供参考)]
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
using namespace std;
const int N=(1<<25)+5;
int n,k;
int cnt[N];
vector<int> ans;
void dfs(int cur,int cover){
while(cnt[cur]<2){
int x=(cur<<1)+cnt[cur];
cnt[cur]++;
dfs(x&cover,cover);
ans.push_back(x);
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
while(cin>>n>>k&&(n+k)){
memset(cnt,0,sizeof cnt);
ans.clear();
int cover=(1<<(n-1))-1;
dfs(0,cover);
cout<<ans[ans.size()-1-k]<<'\n';
}
return 0;
}
:::