1. 程式人生 > >POJ 1392 Ouroboros Snake(數位歐拉)

POJ 1392 Ouroboros Snake(數位歐拉)

%d ostream false 開頭 names += log esp clr

題目鏈接: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(數位歐拉)