<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=EightQueenProblem%2Fda_answer</id>
	<title>EightQueenProblem/da answer - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=EightQueenProblem%2Fda_answer"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=EightQueenProblem/da_answer&amp;action=history"/>
	<updated>2026-05-14T21:05:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=EightQueenProblem/da_answer&amp;diff=31553&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=EightQueenProblem/da_answer&amp;diff=31553&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Project2.exe (Delphi) ==&lt;br /&gt;
&lt;br /&gt;
위키는 머리털나고 처음이라.. -_-;; 제대로 쓰고 있는건지 잘 모르겠군요...&lt;br /&gt;
&lt;br /&gt;
대부분 C, C++ 혹은 자바로 작성하셨던데... 전 델파이로 했습니다. &lt;br /&gt;
사실 위에 USES나 폼, 버튼, 클릭이벤등은 별 필요없는 부분인데... ^^;;;&lt;br /&gt;
&lt;br /&gt;
전 좀 많이 허접이라..T_T 제 소스는 보시면 눈만 아프실 겁니다.&lt;br /&gt;
&lt;br /&gt;
초반에 방향을 잘못잡아 많이 애먹었습니다. 그것땀시 시간도 많이 잡아먹었고...&lt;br /&gt;
맵을 RECORD로 정의 한 다음 한 라인에 하나씩 여왕을 올려 놓고 그 때마다 공격 가능 패스를 다 지우는(?) 방식으로 하려했는데...&lt;br /&gt;
이렇게 하면 쓸데없는 루프를 돌지 않아도 되지만 신경쓸게 좀 많더군요.. -_-;;&lt;br /&gt;
&lt;br /&gt;
화장실에서 볼 일을 보면서 좀 생각해봤는데... 제가 너무 어렵게 진행하고 있는듯 싶더군요.&lt;br /&gt;
그래서 방식을 바꿨습니다. &lt;br /&gt;
공격 패스에 들어가지 않는 위치에 올려 놓는게 아니라 일단 올려 놓고 공격받을 수 있는가 체크하는 방식으로요.. ^^;;&lt;br /&gt;
&lt;br /&gt;
제가 코딩을 할 때마다 느끼는 저의 문제점인데..&lt;br /&gt;
항상 코딩이 끝나면 초반에 설계한 것과는 좀 다른 방향으로 나가있더군요.. -_-;;&lt;br /&gt;
이번에도 왠지 모르게 좀 어설픈...&lt;br /&gt;
&lt;br /&gt;
시간이 되면 코드 정리라도 좀 하려고 했는데... &lt;br /&gt;
벌써 시간이.. -_-;;;; 오후는 이걸로 다 날려먹었네요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위에 소스들을 봤는데 확실히 전 허접이라는게 다시 한번 느껴지네요.. T_T&lt;br /&gt;
난 언제쯤이면 고수가 되려나~~&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
켁... 2번문제... 처음부터 계획이 2먼문제의 요구사항을 충족시키는 방향이었기 땀시..&lt;br /&gt;
전 당연히 그렇게 한줄 알았건만.. 제가 뭔가 잘못하고 있었었네요... -_-;;; &lt;br /&gt;
&lt;br /&gt;
아무리 봐도 소스는 모든 패스를 구하는건데... 이상하다... 생각하다가... &lt;br /&gt;
혹시나 싶어서 출력부분을 리커시브 안쪽으로 옮겨놓으니.. 잘 나오는군요.. -_-;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그나저나...&lt;br /&gt;
난 메모 컴포넌트는 왜 올려 놓은거지.. -_-;; 어차피 showMessage로 보여줄거였으면서....&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;script&amp;amp;gt;&lt;br /&gt;
 unit Unit1;&lt;br /&gt;
 &lt;br /&gt;
 interface&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;
   Dialogs, StdCtrls;&lt;br /&gt;
 &lt;br /&gt;
 const&lt;br /&gt;
   CBoardSize = 8;&lt;br /&gt;
 &lt;br /&gt;
 type&lt;br /&gt;
   TQueenPos = record&lt;br /&gt;
     X: integer;&lt;br /&gt;
     Y: integer;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
   TForm1 = class(TForm)&lt;br /&gt;
     Memo1: TMemo;&lt;br /&gt;
     Button1: TButton;&lt;br /&gt;
     procedure Button1Click(Sender: TObject);&lt;br /&gt;
   private&lt;br /&gt;
     procedure SearchStart();&lt;br /&gt;
     function getNextQueenPos(index, X, Y:integer):boolean;&lt;br /&gt;
     function checkRule(X,Y:integer):boolean;&lt;br /&gt;
     { Private declarations }&lt;br /&gt;
   public&lt;br /&gt;
     QueenPosArr: array of TQueenPos;&lt;br /&gt;
     { Public declarations }&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
   Form1: TForm1;&lt;br /&gt;
 &lt;br /&gt;
 implementation&lt;br /&gt;
 &lt;br /&gt;
 {$R *.dfm}&lt;br /&gt;
 &lt;br /&gt;
 procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   SearchStart();&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure TForm1.SearchStart();&lt;br /&gt;
 var&lt;br /&gt;
   i, j: integer;&lt;br /&gt;
 begin&lt;br /&gt;
   setLength(QueenPosArr, CBoardSize);&lt;br /&gt;
   for i:=0 to CBoardSize-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     QueenPosArr[i].X := -1;&lt;br /&gt;
     QueenPosArr[i].Y := -1;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
   for i:=0 to CBoardSize-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     QueenPosArr[0].X := 0;&lt;br /&gt;
     QueenPosArr[0].Y := i;&lt;br /&gt;
     showMessage(inttostr(i));&lt;br /&gt;
     if getNextQueenPos(0, QueenPosArr[i].X, QueenPosArr[i].Y) then&lt;br /&gt;
     begin&lt;br /&gt;
       for j:=0 to CBoardSize-1 do&lt;br /&gt;
       begin&lt;br /&gt;
         showMessage(inttostr(QueenPosArr[j].X)+&amp;#039;-&amp;#039;+inttostr(QueenPosArr[j].Y));&lt;br /&gt;
       end;&lt;br /&gt;
     end&lt;br /&gt;
     else&lt;br /&gt;
     begin&lt;br /&gt;
 &lt;br /&gt;
     end;&lt;br /&gt;
  end;&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 function TForm1.getNextQueenPos(index, X, Y:integer):boolean;&lt;br /&gt;
 var&lt;br /&gt;
   i: integer;&lt;br /&gt;
   nowIndex: integer;&lt;br /&gt;
 begin&lt;br /&gt;
   for i:=0 to CBoardSize-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     nowIndex := index+1;&lt;br /&gt;
     QueenPosArr[nowIndex].X := nowIndex;&lt;br /&gt;
     QueenPosArr[nowIndex].Y := i;&lt;br /&gt;
     if checkRule(QueenPosArr[nowIndex].X, QueenPosArr[nowIndex].Y) then&lt;br /&gt;
     begin&lt;br /&gt;
       if nowIndex = 7 then&lt;br /&gt;
       begin&lt;br /&gt;
         result := true;&lt;br /&gt;
         exit;&lt;br /&gt;
       end&lt;br /&gt;
       else&lt;br /&gt;
       begin&lt;br /&gt;
         if getNextQueenPos(nowIndex, QueenPosArr[nowIndex].X, QueenPosArr[nowIndex].Y) then&lt;br /&gt;
         begin&lt;br /&gt;
           result := true;&lt;br /&gt;
           exit;&lt;br /&gt;
         end&lt;br /&gt;
         else&lt;br /&gt;
         begin&lt;br /&gt;
           QueenPosArr[nowIndex].X := -1;&lt;br /&gt;
           QueenPosArr[nowIndex].Y := -1;&lt;br /&gt;
         end;&lt;br /&gt;
       end;&lt;br /&gt;
     end&lt;br /&gt;
     else&lt;br /&gt;
     begin&lt;br /&gt;
       QueenPosArr[nowIndex].X := -1;&lt;br /&gt;
       QueenPosArr[nowIndex].Y := -1;&lt;br /&gt;
       if i = CBoardSize-1 then&lt;br /&gt;
       begin&lt;br /&gt;
         result := false;&lt;br /&gt;
       end;&lt;br /&gt;
     end;&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 function TForm1.checkRule(X,Y:integer):boolean;&lt;br /&gt;
 var&lt;br /&gt;
   i: integer;&lt;br /&gt;
 begin&lt;br /&gt;
   for i:=0 to X-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     if QueenPosArr[i].X &amp;amp;gt; -1 then&lt;br /&gt;
     begin&lt;br /&gt;
       if (X=QueenPosArr[i].X) or (Y=QueenPosArr[i].Y) or ((Y-X)=(QueenPosArr[i].Y-QueenPosArr[i].X)) or ((Y+X)=(QueenPosArr[i].Y+QueenPosArr[i].X)) then&lt;br /&gt;
       begin&lt;br /&gt;
         result := false;&lt;br /&gt;
         exit;&lt;br /&gt;
       end;&lt;br /&gt;
     end;&lt;br /&gt;
   end;&lt;br /&gt;
   result := true;&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;script&amp;amp;gt;&lt;br /&gt;
 unit Unit1;&lt;br /&gt;
 &lt;br /&gt;
 interface&lt;br /&gt;
 &lt;br /&gt;
 uses&lt;br /&gt;
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;
   Dialogs, StdCtrls;&lt;br /&gt;
 &lt;br /&gt;
 const&lt;br /&gt;
   CBoardSize = 8;&lt;br /&gt;
 &lt;br /&gt;
 type&lt;br /&gt;
   TQueenPos = record&lt;br /&gt;
     X: integer;&lt;br /&gt;
     Y: integer;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
   TForm1 = class(TForm)&lt;br /&gt;
     Memo1: TMemo;&lt;br /&gt;
     Button1: TButton;&lt;br /&gt;
     procedure Button1Click(Sender: TObject);&lt;br /&gt;
   private&lt;br /&gt;
     procedure SearchStart();&lt;br /&gt;
     function getNextQueenPos(index, X, Y:integer):boolean;&lt;br /&gt;
     function checkRule(X,Y:integer):boolean;&lt;br /&gt;
     { Private declarations }&lt;br /&gt;
   public&lt;br /&gt;
     QueenPosArr: array of TQueenPos;&lt;br /&gt;
     { Public declarations }&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
 var&lt;br /&gt;
   Form1: TForm1;&lt;br /&gt;
 &lt;br /&gt;
 implementation&lt;br /&gt;
 &lt;br /&gt;
 {$R *.dfm}&lt;br /&gt;
 &lt;br /&gt;
 procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;
 begin&lt;br /&gt;
   SearchStart();&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 procedure TForm1.SearchStart();&lt;br /&gt;
 var&lt;br /&gt;
   i: integer;                          // &amp;amp;lt;------ 변수 삭제...&lt;br /&gt;
 begin&lt;br /&gt;
   setLength(QueenPosArr, CBoardSize);&lt;br /&gt;
   for i:=0 to CBoardSize-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     QueenPosArr[i].X := -1;&lt;br /&gt;
     QueenPosArr[i].Y := -1;&lt;br /&gt;
   end;&lt;br /&gt;
 &lt;br /&gt;
   for i:=0 to CBoardSize-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     QueenPosArr[0].X := 0;&lt;br /&gt;
     QueenPosArr[0].Y := i;&lt;br /&gt;
     showMessage(inttostr(i));&lt;br /&gt;
     if getNextQueenPos(0, QueenPosArr[i].X, QueenPosArr[i].Y) then&lt;br /&gt;
     begin&lt;br /&gt;
 &lt;br /&gt;
     end&lt;br /&gt;
     else&lt;br /&gt;
     begin&lt;br /&gt;
 &lt;br /&gt;
     end;&lt;br /&gt;
  end;&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 function TForm1.getNextQueenPos(index, X, Y:integer):boolean;&lt;br /&gt;
 var&lt;br /&gt;
   i, j: integer;                //&amp;amp;lt;------- 변수 추가&lt;br /&gt;
   nowIndex: integer;&lt;br /&gt;
 begin&lt;br /&gt;
   for i:=0 to CBoardSize-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     nowIndex := index+1;&lt;br /&gt;
     QueenPosArr[nowIndex].X := nowIndex;&lt;br /&gt;
     QueenPosArr[nowIndex].Y := i;&lt;br /&gt;
     if checkRule(QueenPosArr[nowIndex].X, QueenPosArr[nowIndex].Y) then&lt;br /&gt;
     begin&lt;br /&gt;
       if nowIndex = 7 then&lt;br /&gt;
       begin&lt;br /&gt;
 &lt;br /&gt;
 //************************************* 이쪽에서 출력하는 방식으로 변환&lt;br /&gt;
         for j:=0 to CBoardSize-1 do&lt;br /&gt;
         begin&lt;br /&gt;
           showMessage(inttostr(QueenPosArr[j].X)+&amp;#039;-&amp;#039;+inttostr(QueenPosArr[j].Y));&lt;br /&gt;
         end;&lt;br /&gt;
 //*************************************&lt;br /&gt;
         result := true;&lt;br /&gt;
         exit;&lt;br /&gt;
       end&lt;br /&gt;
       else&lt;br /&gt;
       begin&lt;br /&gt;
         if getNextQueenPos(nowIndex, QueenPosArr[nowIndex].X, QueenPosArr[nowIndex].Y) then&lt;br /&gt;
         begin&lt;br /&gt;
           result := true;&lt;br /&gt;
           exit;&lt;br /&gt;
         end&lt;br /&gt;
         else&lt;br /&gt;
         begin&lt;br /&gt;
           QueenPosArr[nowIndex].X := -1;&lt;br /&gt;
           QueenPosArr[nowIndex].Y := -1;&lt;br /&gt;
         end;&lt;br /&gt;
       end;&lt;br /&gt;
     end&lt;br /&gt;
     else&lt;br /&gt;
     begin&lt;br /&gt;
       QueenPosArr[nowIndex].X := -1;&lt;br /&gt;
       QueenPosArr[nowIndex].Y := -1;&lt;br /&gt;
       if i = CBoardSize-1 then&lt;br /&gt;
       begin&lt;br /&gt;
         result := false;&lt;br /&gt;
       end;&lt;br /&gt;
     end;&lt;br /&gt;
   end;&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 function TForm1.checkRule(X,Y:integer):boolean;&lt;br /&gt;
 var&lt;br /&gt;
   i: integer;&lt;br /&gt;
 begin&lt;br /&gt;
   for i:=0 to X-1 do&lt;br /&gt;
   begin&lt;br /&gt;
     if QueenPosArr[i].X &amp;amp;gt; -1 then&lt;br /&gt;
     begin&lt;br /&gt;
       if (X=QueenPosArr[i].X) or (Y=QueenPosArr[i].Y) or ((Y-X)=(QueenPosArr[i].Y-QueenPosArr[i].X)) or ((Y+X)=(QueenPosArr[i].Y+QueenPosArr[i].X)) then&lt;br /&gt;
       begin&lt;br /&gt;
         result := false;&lt;br /&gt;
         exit;&lt;br /&gt;
       end;&lt;br /&gt;
     end;&lt;br /&gt;
   end;&lt;br /&gt;
   result := true;&lt;br /&gt;
 end;&lt;br /&gt;
 &lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
EightQueenProblem&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>