📄 unit1.~pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
inputButton1: TButton;
Memo1: TMemo;
procedure inputButton1Click(Sender: TObject);
procedure TileBoard(tr,tc,dr,dc,size:integer);
procedure output(size:integer);
//function Random(var seed:real):real;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
chessnum:integer;
k,size:integer;
dr,dc:integer;
//seed:real;
Board,Board1,LargerBoard:array of array of integer;
chess:array of integer;
implementation
{$R *.dfm}
uses math;
procedure TForm1.inputButton1Click(Sender: TObject);
begin
chessnum:=0;
k:=StrToInt(edit1.Text);
size:=trunc(exp(k*ln(2)));
setlength(Board,size,size);
setlength(Board1,size,size);
dr:=random(size);
dc:=random(size);
//dr:=trunc(size*random);
//dc:=trunc(size*random);
TileBoard(0,0,dr,dc,size);
output(size);
end;
procedure TForm1.TileBoard(tr,tc,dr,dc,size:integer);
var
t,s:integer;
begin
if (size<>1) then
begin
t:=chessnum+1;
chessnum:=chessnum+1;
s:=size div 2;
if (dr<(tr+s))and(dc<(tc+s))
then TileBoard(tr,tc,dr,dc,s)
else begin
Board[tr+s-1][tc+s-1]:=t;
TileBoard(tr,tc,tr+s-1,tc+s-1,s);
end;
if (dr<(tr+s))and(dc>=(tc+s))
then TileBoard(tr,tc+s,dr,dc,s)
else begin
Board[tr+s-1][tc+s]:=t;
TileBoard(tr,tc+s,tr+s-1,tc+s,s);
end;
if (dr>=(tr+s))and(dc<(tc+s))
then TileBoard(tr+s,tc,dr,dc,s)
else begin
Board[tr+s][tc+s-1]:=t;
TileBoard(tr+s,tc,tr+s,tc+s-1,s);
end;
if (dr>=(tr+s))and(dc>=(tc+s))
then TileBoard(tr+s,tc+s,dr,dc,s)
else begin
Board[tr+s][tc+s]:=t;
TileBoard(tr+s,tc+s,tr+s,tc+s,s);
end;
end;
end;
procedure Tform1.output(size:integer);
var
i,j:integer;
str:array of string;
begin
memo1.Clear;
memo1.Lines.Add('残缺块位置为:('+inttostr(dr)+','+inttostr(dc)+');');
memo1.Lines.Add('所需三格板数为:'+inttostr(chessnum));
setlength(LargerBoard,size+2,size+2);
for i:=1 to size do
for j:=1 to size do
LargerBoard[i][j]:=Board[i-1][j-1];
setlength(chess,4);
for i:=1 to size do
for j:=1 to size do
begin
if (LargerBoard[i][j]<>0)and(LargerBoard[i][j]=LargerBoard[i-1][j])
and(LargerBoard[i][j]=LargerBoard[i][j-1]) then
begin
Board1[i-1][j-1]:=1;
Board1[i-2][j-1]:=1;
Board1[i-1][j-2]:=1;
chess[0]:=chess[0]+1;
end;
if (LargerBoard[i][j]<>0)and(LargerBoard[i][j]=LargerBoard[i+1][j])
and(LargerBoard[i][j]=LargerBoard[i][j-1]) then
begin
Board1[i-1][j-1]:=3;
Board1[i][j-1]:=3;
Board1[i-1][j-2]:=3;
chess[2]:=chess[2]+1;
end;
if (LargerBoard[i][j]<>0)and(LargerBoard[i][j]=LargerBoard[i-1][j])
and(LargerBoard[i][j]=LargerBoard[i][j+1]) then
begin
Board1[i-1][j-1]:=2;
Board1[i-2][j-1]:=2;
Board1[i-1][j]:=2;
chess[1]:=chess[1]+1;
end;
if (LargerBoard[i][j]<>0)and(LargerBoard[i][j]=LargerBoard[i+1][j])
and(LargerBoard[i][j]=LargerBoard[i][j+1]) then
begin
Board1[i-1][j-1]:=4;
Board1[i][j-1]:=4;
Board1[i-1][j]:=4;
chess[3]:=chess[3]+1;
end;
end;
setlength(str,size);
for i:=0 to size-1 do
for j:=0 to size-1 do
str[i]:=str[i]+' '+' '+inttostr(Board1[i,j]);
for i:=0 to size-1 do
Memo1.Lines.Add(str[i]);
for i:=0 to 3 do
memo1.Lines.Add('第'+inttostr(i+1)+'种三格板数量为:'+inttostr(chess[i]));
for i:=0 to size-1 do
for j:=0 to size-1 do
begin
LargerBoard[i+1][j+1]:=0;
Board[i][j]:=0;
Board1[i][j]:=0;
end;
for i:=0 to 3 do
chess[i]:=0;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -