生成数独数据的简单算法

https://blog.csdn.net/m0_62916138/article/details/128435237
根据上面文章改写为delphi版的程序,效果如图,版权归原作者所有.
在这里插入图片描述

以下为delphi源码
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.Mask,
RzEdit, RzSpnEdt;

type
TForm1 = class(TForm)
strngrd1: TStringGrid;
btn1: TButton;
lbl1: TLabel;
edt1: TRzSpinEdit;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
procedure writegrid;
procedure shudu_1;
procedure shudu_2;
procedure shudu_3;
procedure dighole(difficulty:integer);
procedure getshudu(difficulty:integer);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
shudu:array[0…8,0…8] of Integer;
hole:array[0…8,0…8] of Integer;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin

getshudu(edt1.IntValue);
writegrid;

end;

procedure TForm1.dighole(difficulty: integer);
begin
difficulty:=difficulty*20;
while difficulty>0 do
begin
shudu[random(9),random(9)]:=0;
dec(difficulty);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
for var i := 0 to 8 do
for var j := 0 to 8 do
shudu[i,j]:=0;

end;

procedure TForm1.getshudu(difficulty: integer);
begin
shudu_1;
shudu_2;
shudu_3;
dighole(difficulty);
end;

procedure TForm1.shudu_1;
var
a:array[0…8] of Integer;
n:integer;
i:Integer;
begin
n:=0;
while(n<9) do
begin
var m:=Random(9)+1;
var flag:=0;
for i := 0 to n do
begin
if a[i]=m then
begin
flag:=1;
break;
end;
end;
if flag=0 then
begin
a[n]:=m;
inc(n);
end;
var k:=0;
for var g:=3 to 5 do
for var h:= 3 to 5 do
begin
shudu[g,h]:=a[k];
Inc(k);
end;

end;
end;

procedure TForm1.shudu_2;
begin
for var i := 3 to 5 do
begin
var l:=0;
for var j := 3 to 5 do
begin
if i=3 then
begin
shudu[i+1][l]:=shudu[i,j];
shudu[i+2,l+6]:=shudu[i,j];
inc(l);
end
else if i=4 then
begin
shudu[i+1][l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end
else if i=5 then
begin
shudu[i-2][l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end;
end;
end;
for var j := 3 to 5 do
begin
var l:=0;
for var i := 3 to 5 do
begin
if j=3 then
begin
shudu[l][j+1]:=shudu[i,j];
shudu[l+6,j+2]:=shudu[i,j];
inc(l);
end
else if j=4 then
begin
shudu[l,j+1]:=shudu[i,j];
shudu[l+6,j-1]:=shudu[i,j];
inc(l);
end
else if j=5 then
begin
shudu[l,j-2]:=shudu[i,j];
shudu[l+6,j-1]:=shudu[i,j];
inc(l);
end;
end;
end;

end;

procedure TForm1.shudu_3;
begin
for var i := 0 to 3 do
begin
var l:=0;
for var j := 3 to 5 do
begin
if i=0 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i+2,l+6]:=shudu[i,j];
inc(l);
end
else if i=1 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end
else if i=2 then
begin
shudu[i-2,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end;
end;
end;
for var i := 6 to 8 do
begin
var l:=0;
for var j := 3 to 5 do
begin
if i=6 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i+2,l+6]:=shudu[i,j];
inc(l);
end
else if i=7 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end
else if i=8 then
begin
shudu[i-2,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end;
end;
end;
end;

procedure TForm1.strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with tstringgrid(sender).Canvas do
begin
pen.Color:=clblack;
brush.Style:=bsclear;
rectangle(rect);
if (acol>2) and (acol<6) then
begin
brush.color:=clmoneyGreen;
fillrect(rect);
textout(rect.Left+2,rect.Top+2,tstringgrid(sender).Cells[acol,arow]);
end;
if (arow>2) and (arow<6) then
begin
brush.color:=clmoneyGreen;
fillrect(rect);
textout(rect.Left+2,rect.Top+2,tstringgrid(sender).Cells[acol,arow]);
end;
if (arow>2) and (arow<6) and (acol>2) and (acol<6) then
begin
brush.color:=clblue;
fillrect(rect);
textout(rect.Left+2,rect.Top+2,tstringgrid(sender).Cells[acol,arow]);
end;
end;
end;

procedure TForm1.writegrid;
begin
for var i := 0 to 8 do
for var j := 0 to 8 do
begin
if shudu[i,j]=0 then
begin
strngrd1.Cells[i,j]:=‘’;
continue;
end else
strngrd1.Cells[i,j]:=inttostr(shudu[i,j]);
end;
end;

end.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值