TOJ 1070 Ouroboros Snake 解題
方法感覺寫起來有點像寬搜。就是每次生成就好了
1
#include<stdio.h>
2
#include<string.h>
3
int s[33000],use[33000],now[33000],data[16][33000];
4
int n,n2,p,q,v,f,i,k;
5
int main()
6

{
7
for(n=2;n<=15;n++)
8
{
9
n2=1<<n;
10
memset(use,0,sizeof(use));
11
p=q=0;
12
s[p++]=0;
13
while(p>0)
14
{
15
v=s[p-1];
16
for(f=0;f<2;f++)
17
if(!use[(v<<1)+f])break;
18
if(f>=2)
{now[q++]=v;p--;}
19
else
20
{
21
use[(v<<1)+f]=1;
22
s[p++] = ((v<<1) + f ) & ((n2>>1) -1);
23
}
24
}
25
for(int i=0;i<n2;i++)
26
data[n][i]=(now[n2-i]<<1) | (now[n2-i-1]);
27
}
28
data[1][0]=0;data[1][1]=1;
29
while(scanf("%d%d",&n,&k),n)printf("%d\n",data[n][k]);
30
return 0;
31
}
32
#include<stdio.h>2
#include<string.h>3
int s[33000],use[33000],now[33000],data[16][33000];4
int n,n2,p,q,v,f,i,k;5
int main()6


{7
for(n=2;n<=15;n++)8

{9
n2=1<<n;10
memset(use,0,sizeof(use));11
p=q=0;12
s[p++]=0;13
while(p>0)14

{15
v=s[p-1];16
for(f=0;f<2;f++)17
if(!use[(v<<1)+f])break;18

if(f>=2)
{now[q++]=v;p--;}19
else20

{21
use[(v<<1)+f]=1;22
s[p++] = ((v<<1) + f ) & ((n2>>1) -1);23
}24
}25
for(int i=0;i<n2;i++) 26
data[n][i]=(now[n2-i]<<1) | (now[n2-i-1]);27
}28
data[1][0]=0;data[1][1]=1;29
while(scanf("%d%d",&n,&k),n)printf("%d\n",data[n][k]);30
return 0;31
}32


