일단 찍어 놓을테니까 좀 세줘- 라는 개념의 소스...다소 엽기 소스라 볼 수있을지도...-_-;;;
버튼1을 누르면 찾는 과정이 애니메이션(?) 됩니다..
여기 있는 소스들중 가장 인간적인(?) 소스라 자부함..
(다들 어쩌면 그렇게 아이디어들이 번뜩이시는지)
~cpp
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
Table: array[0..8-1, 0..8-1] of Boolean;
procedure ClearTable;
var
i, j: Integer;
begin
for i := 0 to 8 -1 do
for j := 0 to 8 -1 do
Table[i, j] := False;
end;
function CountRow(row: Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i := 0 to 8-1 do
if Table[i, row] then
Inc(Result);
end;
procedure SetQueens(n: Integer); // 퀸 배치하기. 이 소스의 핵심함수. n은 현재 사용안한다. 처음엔 RandomSeed로 쓰려했음..-_-;
var
i, row: Integer;
begin
ClearTable;
for i := 0 to 8-1 do // 가로 세로만 조건에 일치하도록 랜덤하게 배치함.
while True do
begin
row := random(8);
Table[i, row] := True;
if CountRow(row) > 1 then
Table[i, row] := False
else
Break;
end;
end;
function CheckQueens: Boolean; // 제대로 배치되었는지 검사하는 함수.
function CountColumn(column: Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i := 0 to 8-1 do
if Table[column, i] then
Inc(Result);
end;
function CountSlash(column: Integer): Integer;
var
i: Integer;
x, y: Integer;
begin
Result := 0;
for i := 0 to 8*2-1 do
begin
x := column - i;
y := i;
if (x > 7) or (y > 7) or (x < 0) or (y < 0) then
Continue;
if Table[x, y] then
Inc(Result);
end;
end;
function CountBackSlash(column: Integer): Integer;
var
i: Integer;
x, y: Integer;
begin
Result := 0;
for i := 0 to 8*2-1 do
begin
x := column + i;
y := i;
if (x > 7) or (y > 7) or (x < 0) or (y < 0) then
Continue;
if Table[x, y] then
Inc(Result);
end;
end;
var
i: Integer;
begin
Result := False;
for i := 0 to 8-1 do
begin
if CountRow(i) > 1 then
Exit;
if CountColumn(i) > 1 then
Exit;
end;
for i := 0 to 16-1 do
if CountSlash(i) > 1 then
Exit;
for i := -8 to 8-1 do
if CountBackSlash(i) > 1 then
Exit;
Result := True;
end;
procedure DrawQueens;
var
i, j: Integer;
x, y: Integer;
r: TRect;
begin
for i := 0 to 8 -1 do
for j := 0 to 8 -1 do
begin
x := i * 32;
y := j * 32;
r := Bounds(x, y, 32, 32);
if Table[i, j] then
Form1.Canvas.Brush.Color := clRed
else
Form1.Canvas.Brush.Color := clWhite;
Form1.Canvas.Rectangle(r);
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
DrawQueens;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
n: Integer;
begin
Randomize;
n := 0;
repeat
SetQueens(n);
Inc(n);
DrawQueens;
until CheckQueens;
end;
end.
모든 퀸 찾기. 이런건 반칙이다- 하셔도 별 할말이 없음 -_-;;;
30분동안 뭔가 다른 방법을 찾아 볼라고 고민을 했습니다만 포기.......-_-;;
~cpp
procedure FindAllQueens;
var
n: Integer;
i0, i1, i2, i3, i4, i5, i6, i7: Integer;
begin
n := 0;
for i0 := 0 to 8-1 do
for i1 := 0 to 8-1 do
for i2 := 0 to 8-1 do
for i3 := 0 to 8-1 do
for i4 := 0 to 8-1 do
for i5 := 0 to 8-1 do
for i6 := 0 to 8-1 do
for i7 := 0 to 8-1 do
begin
ClearTable;
Table[0, i0] := True;
Table[1, i1] := True;
Table[2, i2] := True;
Table[3, i3] := True;
Table[4, i4] := True;
Table[5, i5] := True;
Table[6, i6] := True;
Table[7, i7] := True;
if CheckQueens then
begin
DrawQueens;
Inc(n);
form1.Caption := inttostr(n);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FindAllQueens;
end;