【堆塔问题求Pascal程序】
Pascal的编译器我没有、我用Delphi做的测试、
Delphi2010+Windows7测试通过:
procedureTForm1.FormCreate(Sender:TObject);
var
f:array[0..99,0..99]ofDWORD;
n,nn,k,i:Cardinal;
begin
{
堆塔问题,设有n个边长为1的正立方体,在一个宽为1的轨道上堆塔,但塔本身不能分离。
例如n=1时,只有1种方案
n=2时有2种方案
堆塔的规则为底层必须有支撑
程序要求:输入n(n<=40),求出
①总共有多少种不同的方案
②堆成每层的方案数是多少,例如n=6时,堆成1层的方案数为1,……堆成6层的方案数为1……
(1)假设数塔有k列组成,设每一列的高度为xi。则x1+x2+..+xk=n。其中xi>0。
所以y1+y2+..+yk=n-k.其中y1=x1-1;y1>=0.共有C(n-1,k-1)中组合。
当k从1取到n,所以总共有2^(n-1)中方案。
(2)设第一列删除则分为两种情况。第一列的高度为k,第一个的高度小于k。
}
try
//则f(n,k)=f(n-i,k)(0<i<k)+f(n-k,i)(0<i<=k)
n:=StrToInt(InputBox('','n=?',''));
//f(n,1)=1f(n,n)=1
//for(nn=2;nn<=n;nn++)
fornn:=2tondo
begin
//for(k=2;k<=nn-1;k++)
fork:=2tonn-1do
begin
//{
//for(i=1;i<k;i++)f[nn][k]+=f[nn-i][k];
fori:=1tok-1do
begin
//SetLength(f,nn,k);
f[nn][k]:=f[nn][k]+f[nn-i][k]
end;
//for(i=1;i<=k;i++)
fori:=0tokdo
//if(nn-k>0)f[nn][k]+=f[nn-k][i];
ifnn-k>0then
f[nn][k]:=f[nn][k]+f[nn-k][i]
//}
end;
end;
except
ShowMessage('Error');
end;
end;
堆堆塔怎么玩相关文章: