pku 1392 Ouroboros Snake

这题目跟hdu2894差不多,只不过求出序列之后要求算出对应第k个长度为n的字段所代表的数字

#include<iostream>
#include<string>
using namespace std;
int flag[(1<<15)+1],n,cnt,ans[(1<<15)+1],sum[(1<<15)+1];
void dfs(int u)
{   
	int t=((u<<1)&((1<<n)-1)); 
	if(!flag[t])  
	{      
		flag[t]=1;  
		dfs(t);  
		ans[cnt++]=0; 
	}    
	if(!flag[t+1])  
	{     
		flag[t+1]=1;    
		dfs(t+1);      
		ans[cnt++]=1; 
	}
}
int main()
{  
	int k;
	while(cin>>n>>k&&(n||k)) 
	{     
		memset(flag,0,sizeof(flag)); 
		cnt=0;    
		dfs(0);    
		int l=0;
		for(int i=1;i<n;i++)   
		{ 
			sum[l++]=0;
		}
		for(int i=cnt-1;i>=n-1;i--)    
		{ 
			sum[l++]=ans[i];
		}
		 if(k==0) {cout<<0<<endl;continue;}
	     int s=0;
		l=k;
		for(int i=n-1;i>=0;i--)
		{
			s+=sum[l++]<<i;
			if(l>=(1<<n)) break;
		}
		cout<<s<<endl;
	}    
	return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2129784.html