Advertisement
Nordicus

8 Queen problem solver

Nov 18th, 2012
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.21 KB | None | 0 0
  1. program FPProgT15;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   {$IFDEF UNIX}{$IFDEF UseCThreads}
  7.   cthreads,
  8.   {$ENDIF}{$ENDIF}
  9.   Classes,
  10.   SysUtils;
  11.  
  12. type
  13.   QueenArray = Array[1..8] of Integer;
  14.  
  15.  
  16. var
  17.   MainQueens: QueenArray;
  18.   i: integer;
  19.   {$R *.res}
  20.  
  21. function isLegit(Queens: QueenArray): Boolean;
  22. var
  23.    i, j: integer;
  24.    final: boolean;
  25. begin
  26.      final := true;
  27.      for i := 1 to 8 do
  28.      begin
  29.        if final = true then
  30.        begin
  31.          for j := i - 1 downto 1 do
  32.          begin
  33.             if Queens[i] = Queens[j] then final := false
  34.             else if Queens[j] = Queens[i] - (i-j) then final := false
  35.             else if Queens[j] = Queens[i] + (i-j) then final := false;
  36.          end;
  37.        end;
  38.      if final = true then isLegit := true
  39.      else isLegit := false;
  40.      end;
  41. end;
  42.  
  43. procedure quit;                                    
  44. begin
  45.   writeln;
  46.   writeln;
  47.   writeln('Press <Enter> To Quit');
  48.   readln;
  49. end;
  50.  
  51. procedure DrawBoard(Queens: QueenArray);            
  52. var
  53.    i, j: integer;
  54.    isWhite: Boolean;
  55.    OutStr: String;
  56. begin
  57.   for i := 8 downto 1 do
  58.   begin
  59.   OutStr := '';
  60.     for j := 1 to 8 do
  61.     begin
  62.       if ((i + j) mod 2) = 0 then isWhite := false
  63.       else isWhite := true;
  64.       if Queens[j] = i then
  65.       begin
  66.         if isWhite = true then OutStr := OutStr + ' W Q'
  67.         else OutStr := OutStr + ' B Q';
  68.       end
  69.       else
  70.       begin
  71.         if isWhite = true then OutStr := OutStr + ' WNQ'
  72.         else OutStr := OutStr + ' BNQ'
  73.       end;
  74.     end;
  75.     Writeln(OutStr);
  76.   end;
  77.   Writeln;
  78. end;
  79.  
  80. procedure AdvanceQueen(Index: Integer);            
  81. var
  82.   i: integer;
  83. begin
  84.   if MainQueens[Index] < 8 then MainQueens[Index] := MainQueens[Index] + 1 //if there is room to progress then progress
  85.   else
  86.   begin
  87.     index := index + 1;
  88.     for i := Index - 1 downto 1 do
  89.     begin
  90.       MainQueens[i] := 1
  91.     end;
  92.     if Index < 9 then AdvanceQueen(Index);
  93.   end;
  94. end;
  95.  
  96. begin
  97.   for i := 1 to 8 do MainQueens[i] := 1; //initialise all the queens
  98.   for i := 1 to 16777216 do
  99.   begin
  100.     AdvanceQueen(1);
  101.     if isLegit(MainQueens) = true then
  102.     begin
  103.       DrawBoard(MainQueens);
  104.       readln;
  105.     end;
  106.   end;
  107.   quit;
  108. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement