做了做poj上面的1037http://poj.org/problem?id=1037,水平有限,看的大牛思路,自己“回忆”出来的
题目中给了个好心的提示You may assume, that the total number of cute little wooden fences with 20 planks fits into a 64-bit signed integer variable (long long in C/C++, int64 in FreePascal)自己算了算,其实是不会超过32位的,于是乎按照提示写了long long在C中定义大整数,程序如下
#include<stdio.h>
#include<stdlib.h>
typedef enum __bool{false=0,true=1}bool;
long long up[22][22],down[22][22];
int ans[22];
void getnext(int n,long long c,bool uod)
{
if(n==0)
return;
int t,i;
long long sum;
if(!uod)
{
t=ans[n+1];
sum=0;
while(sum+down[n][t]<c)
{
sum+=down[n][t];
t++;
}
}
else
{
t=1;
sum=0;
while(sum+up[n][t]<c)
{
sum+=up[n][t];
t++;
}
}
ans[n]=t;
getnext(n-1,c-sum,!uod);
for(i=1;i<n;i++)
if(ans[i]>=t)
ans[i]++;
}
int main()
{
long long c,sum;
int n,all,i,j,k,t;
up[1][1]=down[1][1]=1;
for(i=2;i<21;i++)
{
for(j=1;j<=i;j++)
{
down[i][j]=up[i][j]=0;
for(k=j;k<i;k++)
up[i][j]+=down[i-1][k];
for(k=1;k<j;k++)
down[i][j]+=up[i-1][k];
}
}
scanf("%d",&all);
while(all--)
{
scanf("%d%lld",&n,&c);
for(t=1,sum=0;sum+up[n][t]+down[n][t]<c;t++)
{
sum+=up[n][t];
sum+=down[n][t];
}
ans[n]=t;
if(sum+down[n][t]<c)
getnext(n-1,c-sum-down[n][t],false);
else
getnext(n-1,c-sum,true);
for(i=1;i<n;i++)
if(ans[i]>=t)
ans[i]++;
for(i=n;i>0;i--)
printf("%d ",ans[i]);
printf("\n");
}
return 0;
}
结果在poj上换来了一次又一次的CE
Main.c
F:\temp\11212041.219768\Main.c(10) : error C2143: syntax error : missing ';' before 'type'
F:\temp\11212041.219768\Main.c(11) : error C2143: syntax error : missing ';' before 'type'
F:\temp\11212041.219768\Main.c(14) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(15) : error C2065: 'sum' : undeclared identifier
F:\temp\11212041.219768\Main.c(16) : error C2065: 'sum' : undeclared identifier
F:\temp\11212041.219768\Main.c(16) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(18) : error C2065: 'sum' : undeclared identifier
F:\temp\11212041.219768\Main.c(18) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(19) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(24) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(25) : error C2065: 'sum' : undeclared identifier
F:\temp\11212041.219768\Main.c(26) : error C2065: 'sum' : undeclared identifier
F:\temp\11212041.219768\Main.c(26) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(28) : error C2065: 'sum' : undeclared identifier
F:\temp\11212041.219768\Main.c(28) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(29) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(32) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(33) : error C2065: 'sum' : undeclared identifier
F:\temp\11212041.219768\Main.c(34) : error C2065: 'i' : undeclared identifier
F:\temp\11212041.219768\Main.c(34) : error C2065: 'i' : undeclared identifier
F:\temp\11212041.219768\Main.c(34) : error C2065: 'i' : undeclared identifier
F:\temp\11212041.219768\Main.c(35) : error C2065: 'i' : undeclared identifier
F:\temp\11212041.219768\Main.c(35) : error C2065: 't' : undeclared identifier
F:\temp\11212041.219768\Main.c(36) : error C2065: 'i' : undeclared identifier
换成C++交的时候
又崩出这个错了,不知道是怎么个问题,C++不支持枚举类型么?
匆匆忙忙查了查,还是没结果,希望路过的大牛指点一下,同时原谅我在这里发水帖啊