不是VIP会员,不能显示答案

题目解答

题目:
问题描述:共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.
考点:
分析:
解答:
评论:
老师: