Advertisement
MannyPardo

task5.2

Mar 20th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.96 KB | None | 0 0
  1. unit MainW;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls,
  8.   Vcl.Imaging.jpeg, Vcl.ExtCtrls;
  9.  
  10. type
  11.   TMainWin = class(TForm)
  12.     MainMenu: TMainMenu;
  13.     BtnFind: TMenuItem;
  14.     ImgField: TImage;
  15.     BtnAbout: TMenuItem;
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure BtnFindClick(Sender: TObject);
  18.     procedure BtnAboutClick(Sender: TObject);
  19.  
  20.   private
  21.     { Private declarations }
  22.   public
  23.     { Public declarations }
  24.   end;
  25.  
  26. type
  27.    TArrang = array [1..8] of Byte;
  28.  
  29. const
  30.    TextAbout = 'Решение задачи о 8 ферзях. Нужно расставить на шахматной доске 8 ферзей так, чтобы они не били друг друга.';
  31.  
  32.  
  33. var
  34.    MainWin: TMainWin;
  35.    AllArrangements: array of TArrang;
  36.    CurrArrang: TArrang;
  37.    CurrShownArrang: Integer;
  38.    BmpQueenPic, BmpFieldPic: TBitMap;
  39.  
  40.  
  41. implementation
  42.  
  43. {$R *.dfm}
  44.  
  45. function IsQueenFits(var A: TArrang; CurrVert, CurrHor: Byte): Boolean;
  46. var
  47.    i: Byte;
  48. begin
  49.    i := 1;
  50.    while (i < CurrVert) and (CurrHor <> A[i]) and (Abs(CurrVert - i) <> Abs(CurrHor - A[i])) do
  51.       Inc(i);
  52.    IsQueenFits := i = CurrVert;
  53. end;
  54.  
  55. procedure FindAllArrangements(CurrVert: Byte);
  56. var
  57.    i, CurrHor: Byte;
  58. begin
  59.    for CurrHor := 1 to 8 do
  60.        if IsQueenFits(CurrArrang, CurrVert, CurrHor) then
  61.          begin
  62.             CurrArrang[CurrVert] := CurrHor;
  63.             if CurrVert = 8 then
  64.             begin
  65.              SetLength(AllArrangements, Length(AllArrangements) + 1);
  66.              AllArrangements[High(AllArrangements)] := CurrArrang;
  67.             end;
  68.             FindAllArrangements(CurrVert + 1);
  69.          end;
  70. end;
  71.  
  72. procedure DrawArrang(Num: Integer);
  73. var
  74.    tmpArrang: TArrang;
  75.    i: Integer;
  76. begin
  77.    tmpArrang := AllArrangements[Num];
  78.    for i := 1 to 8 do
  79.       MainWin.ImgField.Canvas.Draw(62 * (i - 1), 62 * (tmpArrang[i] - 1) + 2, BmpQueenPic);
  80. end;
  81.  
  82. procedure InitQueenPic;
  83. var
  84.    Path: string;
  85. begin
  86.    Path := ExtractFileDir(Application.ExeName);
  87.    BmpQueenPic := TBitMap.Create;
  88.    BmpQueenPic.LoadFromFile(path + '\img\queen.bmp');
  89.    BmpQueenPic.Transparent := true;
  90.    BmpFieldPic := TBitMap.Create;
  91.    BmpFieldPic.LoadFromFile(path + '\img\field.bmp');
  92.    BmpFieldPic.Transparent := true;
  93. end;
  94.  
  95. procedure EraseField;
  96. begin
  97.    MainWin.ImgField.Canvas.Draw(0, 0, BmpFieldPic);
  98. end;
  99.  
  100. procedure TMainWin.BtnAboutClick(Sender: TObject);
  101. begin
  102.    MessageBox(Handle, TextAbout, 'Информация', MB_OK);
  103. end;
  104.  
  105. procedure TMainWin.BtnFindClick(Sender: TObject);
  106. begin
  107.    if CurrShownArrang < High(AllArrangements) then
  108.       Inc(CurrShownArrang)
  109.    else
  110.       CurrShownArrang := 0;
  111.    EraseField;
  112.    DrawArrang(CurrShownArrang);
  113.  
  114. end;
  115.  
  116. procedure TMainWin.FormCreate(Sender: TObject);
  117. begin
  118.    FindAllArrangements(1);
  119.    CurrShownArrang := -1;
  120.    InitQueenPic;
  121. end;
  122.  
  123. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement