问题描述:共22分(3+2+2+3+4+2+3+3分)
拼图形:边长为1的正方形面积为1,从边长为1的正方形出发可以用2个
边长为1的正方形拼成面积为2的长方形:
同时约定:
1.边长对应相等的长方形被认为是相同的;(所以下边的两个面积为2的长方形只看作
一个长方形);
2.长度相等的边才能拼接,且两个边必须重合。从面积为2的长方形出发,用2个面积为2的长方形可拼出面积为4的长方形(包括正方形),拼法如下:
同样再从面积为4的长方形(包括正方形)出发,可以拼成面积为8的长方形,拼法如
下:
可以按上面的方法继续拼下去。
问题:输入一个数N,输出面积不超过N的所有可能拼法。例如:当N=20时,
输出:(1,1),(2,1),(4,2),(8,2),(16,3)即面积为1的拼法1种,面积为2的拼法1种,面积为
4的拼法2种,面积为8的拼法2种,面积为16的拼法3种。
[算法说明]:矩形可以用三个数x,y,s来表示,其中x,y表示边长,s表示面积,并用数组
G[1..100,1..3]表示图形。
当给出n之后,可能拼接的次数为r满足:2r<=N<2r+1(不包括面积为1的拼法);
用数组b[1..100]记录各种面积可能出现的拼法。
Program exp8(input,output);
type g=record x,y,z:integer end;
var g1:array[1..100] of g;
i,j,n,s1,jj,j1,j2,i1 :integer;
b:array[1..100] of integer;
gw:g;
Function eq(gk:g):boolean;
var jeq:integer; p:boolean;
begin
p:=true; jeq:=1;
while (p and (jeq<=j)) do
if ((gk.x=g1[jeq].x) and (gk.y=g1[jeq].y))
or ((gk.x=g1[jeq].y) and (gk.y=g1[jeq].x))
then p:=false else jeq:=jeq+1;
eq:=p
end;
Begin
readln(n); n:=n+1; s1:=1; jj:=1;
while S1<N do
begin S1:=S1+S1 ; jj:=jj+1 end;
JJ:=JJ-1 ; j1:=1; j:=1;
g1[j].x:=1; g1[j].y:=1; g1[j].z:=1;
for i:=2 to jj do
begin
j2:=j;
for i1:=j1 to j2 do
begin
gw.x:=g1[i1].x*2; gw.y:=g1[i1].y; gw.z:=g1[i1].z*2;
if Eq(gw) then begin
j:=j+1; g1[j]:=gw
end;
gw.x:=g1[i1].x; Gw.y:=G1[i1].y*2
if eq(gw) then begin
j:=j+1; g1[i]:=Gw ;
end;
end;
j1:=j2+1
end;
for i:=1 to n do b[i]:=0;
for i:=1 to j do B[g1[i].z]:=B[g1[i].z]+1 ;
for i:=1 to n do if B[i]<>0 then write('(',i,',',b[i],')');
End.