일단 찍어 놓을테니까 좀 세줘- 라는 개념의 소스...다소 엽기 소스라 볼 수있을지도...-_-;;;
버튼1을 누르면 찾는 과정이 애니메이션(?) 됩니다..
여기 있는 소스들중 가장 인간적인(?) 소스라 자부함.. (다들 어쩌면 그렇게 아이디어들이 번뜩이시는지)
버튼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분동안 뭔가 다른 방법을 찾아 볼라고 고민을 했습니다만 포기.......-_-;;
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;