m78星云存在吗:在n*n的正方形中放置长为2,宽为1的长条块,问放置方案如何

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 07:09:19

const n=4;
  var k,u,v,result:integer;
  a:array[1..n,1..n]of char;
  procedure printf; {输出}
  begin
  result:=result+1; {方案总数加1}
  writeln('--- ',result,' ---');
  for v:=1 to n do begin
  for u:=1 to n do write(a[u,v]); writeln end; writeln;
  end;
  procedure try; {填放长条块}
  var i,j,x,y:integer; full:boolean;
  begin
  full:=true;
  if k<>trunc(n*n/2) then full:=false;{测试是否已放满}
  if full then printf; {放满则可输出}
  if not full then begin {未满}
  x:=0;y:=1; {以下先搜索未放置的第一个空位置}
  repeat
  x:=x+1;
  if x>n then begin x:=1;y:=y+1 end
  until a[x,y]=' ';
  {找到后,分两种情况讨论}
  if a[x+1,y]=' ' then begin {第一种情况:横向放置长条块}
  k:=k+1; {记录已放的长条数}
  a[x,y]:=chr(k+ord('@')); {放置}
  a[x+1,y]:=chr(k+ord('@'));
  try; {递归找下一个空位置放}
  k:=k-1;
  a[x,y]:=' '; {回溯,恢复原状}
  a[x+1,y]:=' '
  end;
  if a[x,y+1]=' ' then begin {第二种情况:竖向放置长条块}
  k:=k+1; {记录已放的长条数}
  a[x,y]:=chr(k+ord('0')); {放置}
  a[x,y+1]:=chr(k+ord('0'));
  try; {递归找下一个空位置放}
  k:=k-1;
  a[x,y]:=' '; {回溯,恢复原状}
  a[x,y+1]:=' '
  end;
  end;
  end;
  begin {主程序}
  fillchar(a,sizeof(a),' '); {记录放置情况的字符数组,初始值为空格}
  result:=0; k:=0; {k记录已放的块数,如果k=n*n/2,则说明已放满}
  try; {每找到一个空位置,把长条块分别横放和竖放试验}
  end.

const n=4;
var k,u,v,result:integer;
a:array[1..n,1..n]of char;
procedure printf; {输出}
begin
result:=result+1; {方案总数加1}
writeln('--- ',result,' ---');
for v:=1 to n do begin
for u:=1 to n do write(a[u,v]); writeln end; writeln;
end;
procedure try; {填放长条块}
var i,j,x,y:integer; full:boolean;
begin
full:=true;
if k<>trunc(n*n/2) then full:=false;{测试是否已放满}
if full then printf; {放满则可输出}
if not full then begin {未满}
x:=0;y:=1; {以下先搜索未放置的第一个空位置}
repeat
x:=x+1;
if x>n then begin x:=1;y:=y+1 end
until a[x,y]=' ';
{找到后,分两种情况讨论}
if a[x+1,y]=' ' then begin {第一种情况:横向放置长条块}
k:=k+1; {记录已放的长条数}
a[x,y]:=chr(k+ord('@')); {放置}
a[x+1,y]:=chr(k+ord('@'));
try; {递归找下一个空位置放}
k:=k-1;
a[x,y]:=' '; {回溯,恢复原状}
a[x+1,y]:=' '
end;
if a[x,y+1]=' ' then begin {第二种情况:竖向放置长条块}
k:=k+1; {记录已放的长条数}
a[x,y]:=chr(k+ord('0')); {放置}
a[x,y+1]:=chr(k+ord('0'));
try; {递归找下一个空位置放}
k:=k-1;
a[x,y]:=' '; {回溯,恢复原状}
a[x,y+1]:=' '
end;
end;
end;
begin {主程序}
fillchar(a,sizeof(a),' '); {记录放置情况的字符数组,初始值为空格}
result:=0; k:=0; {k记录已放的块数,如果k=n*n/2,则说明已放满}
try; {每找到一个空位置,把长条块分别横放和竖放试验}
end.