POJ 1392 Ouroboros Snake(数位欧拉)
Posted Yeader
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1392 Ouroboros Snake(数位欧拉)相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=1392
题目大意:题意看的我头痛,其实跟HDU2894差不多,但是这题要求输出这条路径上第k个数,而不是输出路径。
解题思路:也跟HDU2894差不多。。。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define CLR(arr,val) memset(arr,val,sizeof(arr)) 5 using namespace std; 6 const int N=16; 7 8 int n,k,cnt; 9 int ans[1<<N]; 10 bool vis[1<<N]; 11 12 void euler(int st) { 13 int s1=(st<<1)&((1<<n)-1); 14 int s2=s1+1; 15 //先试着添加0,再尝试添加1 16 if (!vis[s1]){ 17 vis[s1]=1; 18 euler(s1); 19 ans[++cnt]=0; 20 } 21 if (!vis[s2]) { 22 vis[s2]=1; 23 euler(s2); 24 ans[++cnt]=1; 25 } 26 } 27 28 void init(){ 29 CLR(vis,false); 30 CLR(ans,0); 31 cnt=0; 32 } 33 34 int main(){ 35 while(~scanf("%d%d",&n,&k)&&(n||k)){ 36 init(); 37 euler(0); 38 cnt+=n-1; //cnt此时等于2^n还要补上开头0的n-1位 39 cnt-=k; //定位到第k个数 40 int t=0; 41 for(int i=0;i<n;i++){ 42 t=t*2+ans[cnt-i]; 43 } 44 printf("%d\\n",t); 45 } 46 return 0; 47 }
以上是关于POJ 1392 Ouroboros Snake(数位欧拉)的主要内容,如果未能解决你的问题,请参考以下文章
Ouroboros:A Provably Secure Proof-of-Stake Blockchain Protocol 学习总结