From b7a63ee8956d977ad3364a1d8f509e307232a22a Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 28 Dec 2025 19:31:39 +0100 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B8?= =?UTF-8?q?=D0=BB=204-=D0=B5=20=D1=83=D0=BF=D1=80=D0=B0=D0=B6=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=204-=D0=B9=20=D0=B3=D0=BB=D0=B0=D0=B2=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4/4_prim/labyrinth.ico | Bin 0 -> 62632 bytes .../4/4_prim/labyrinth.lpi | 90 +++ .../4/4_prim/labyrinth.lpr | 28 + .../4/4_prim/labyrinth.lps | 189 +++++++ .../4/4_prim/mazeunit.pas | 85 +++ .../4/4_prim/sample.txt | 21 + .../4/4_prim/unit1.lfm | 69 +++ .../4/4_prim/unit1.pas | 513 ++++++++++++++++++ Занимательное программирование/README.txt | 6 +- 9 files changed, 999 insertions(+), 2 deletions(-) create mode 100644 Занимательное программирование/4/4_prim/labyrinth.ico create mode 100644 Занимательное программирование/4/4_prim/labyrinth.lpi create mode 100644 Занимательное программирование/4/4_prim/labyrinth.lpr create mode 100644 Занимательное программирование/4/4_prim/labyrinth.lps create mode 100644 Занимательное программирование/4/4_prim/mazeunit.pas create mode 100644 Занимательное программирование/4/4_prim/sample.txt create mode 100644 Занимательное программирование/4/4_prim/unit1.lfm create mode 100644 Занимательное программирование/4/4_prim/unit1.pas diff --git a/Занимательное программирование/4/4_prim/labyrinth.ico b/Занимательное программирование/4/4_prim/labyrinth.ico new file mode 100644 index 0000000000000000000000000000000000000000..86b1038442b06e563d82dd4fbd595eb1f52fcfd2 GIT binary patch literal 62632 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 A*8l(j literal 0 HcmV?d00001 diff --git a/Занимательное программирование/4/4_prim/labyrinth.lpi b/Занимательное программирование/4/4_prim/labyrinth.lpi new file mode 100644 index 0000000..2edb9a2 --- /dev/null +++ b/Занимательное программирование/4/4_prim/labyrinth.lpi @@ -0,0 +1,90 @@ + + + + + + + + + <Scaled Value="True"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True"/> + </XPManifest> + <Icon Value="0"/> + </General> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="LCL"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="labyrinth.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="unit1.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="Unit1"/> + </Unit> + <Unit> + <Filename Value="maze.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="MazeUnit"/> + </Unit> + <Unit> + <Filename Value="sample.txt"/> + <IsPartOfProject Value="True"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="labyrinth"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf3"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/Занимательное программирование/4/4_prim/labyrinth.lpr b/Занимательное программирование/4/4_prim/labyrinth.lpr new file mode 100644 index 0000000..6cb02f1 --- /dev/null +++ b/Занимательное программирование/4/4_prim/labyrinth.lpr @@ -0,0 +1,28 @@ +program labyrinth; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX} + cthreads, + {$ENDIF} + {$IFDEF HASAMIGA} + athreads, + {$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, Unit1, MazeUnit + { you can add units after this }; + +{$R *.res} + +begin + RequireDerivedFormResource:=True; + Application.Scaled:=True; + {$PUSH}{$WARN 5044 OFF} + Application.MainFormOnTaskbar:=True; + {$POP} + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. + diff --git a/Занимательное программирование/4/4_prim/labyrinth.lps b/Занимательное программирование/4/4_prim/labyrinth.lps new file mode 100644 index 0000000..26829bd --- /dev/null +++ b/Занимательное программирование/4/4_prim/labyrinth.lps @@ -0,0 +1,189 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="12"/> + <BuildModes Active="Default"/> + <Units> + <Unit> + <Filename Value="labyrinth.lpr"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="3"/> + <CursorPos X="25" Y="13"/> + <UsageCount Value="29"/> + <Loaded Value="True"/> + </Unit> + <Unit> + <Filename Value="unit1.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="Form1"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="Unit1"/> + <IsVisibleTab Value="True"/> + <TopLine Value="227"/> + <CursorPos X="14" Y="233"/> + <UsageCount Value="29"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + </Unit> + <Unit> + <Filename Value="maze.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="MazeUnit"/> + <EditorIndex Value="-1"/> + <CursorPos X="27" Y="7"/> + <UsageCount Value="29"/> + </Unit> + <Unit> + <Filename Value="sample.txt"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="2"/> + <CursorPos X="4" Y="21"/> + <UsageCount Value="29"/> + <Loaded Value="True"/> + <DefaultSyntaxHighlighter Value="Text"/> + </Unit> + <Unit> + <Filename Value="mazeunit.pas"/> + <UnitName Value="MazeUnit"/> + <EditorIndex Value="1"/> + <CursorPos X="19" Y="26"/> + <UsageCount Value="15"/> + <Loaded Value="True"/> + </Unit> + <Unit> + <Filename Value="C:\opt\lazarus\fpc\3.2.2\source\rtl\objpas\classes\classesh.inc"/> + <EditorIndex Value="-1"/> + <CursorPos X="4" Y="27"/> + <UsageCount Value="10"/> + </Unit> + </Units> + <JumpHistory HistoryIndex="29"> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="328" Column="88" TopLine="310"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="471" Column="33" TopLine="454"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="473" Column="22" TopLine="471"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="474" Column="3" TopLine="473"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="503" Column="30" TopLine="420"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="187" TopLine="187"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="320" Column="24" TopLine="298"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="460" Column="19" TopLine="457"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="493" Column="14" TopLine="468"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="39" Column="22" TopLine="24"/> + </Position> + <Position> + <Filename Value="mazeunit.pas"/> + <Caret Line="14" Column="33"/> + </Position> + <Position> + <Filename Value="mazeunit.pas"/> + <Caret Line="72" Column="25" TopLine="55"/> + </Position> + <Position> + <Filename Value="mazeunit.pas"/> + <Caret Line="17" Column="16"/> + </Position> + <Position> + <Filename Value="mazeunit.pas"/> + <Caret Line="25" Column="16"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="11"/> + </Position> + <Position> + <Filename Value="sample.txt"/> + <Caret Line="5" Column="9"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="472" Column="33" TopLine="458"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="483" Column="11" TopLine="458"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="37" Column="19" TopLine="22"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="28" Column="67" TopLine="16"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="39" Column="22" TopLine="16"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="148" Column="22" TopLine="123"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="356" Column="36" TopLine="356"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="498" Column="7" TopLine="473"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="14" Column="27" TopLine="7"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="46" Column="27" TopLine="34"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="268" Column="56" TopLine="254"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="338" Column="10" TopLine="323"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="223" Column="19" TopLine="213"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="287" Column="17" TopLine="269"/> + </Position> + </JumpHistory> + <RunParams> + <FormatVersion Value="2"/> + <Modes ActiveMode=""/> + </RunParams> + </ProjectSession> +</CONFIG> diff --git a/Занимательное программирование/4/4_prim/mazeunit.pas b/Занимательное программирование/4/4_prim/mazeunit.pas new file mode 100644 index 0000000..1c24dbb --- /dev/null +++ b/Занимательное программирование/4/4_prim/mazeunit.pas @@ -0,0 +1,85 @@ +unit MazeUnit; + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes, SysUtils; + +type + Location = record + left_wall, up_wall: Boolean; + end; + Maze = array of array of Location; + +(* Загрузить лабиринт. *) +procedure LoadMaze(var TheMaze: Maze; FileName: string); +(* Сохранить лабиринт *) +procedure SaveMaze(TheMaze: Maze; FileName: string); + +function CanGo(TheMaze: Maze; x, y, dx, dy: Integer): Boolean; + +implementation + +procedure LoadMaze(var TheMaze: Maze; FileName: string); +var f: TextFile; (* Файл с описанием лабиринта *) + Height, Width: Integer; (* высота и ширина лабиринта *) + x, y: Integer; (* текущая локация *) + lw, uw: Integer; (* временные переменные *) +begin + AssignFile(f, FileName); (* открыть файл *) + Reset(f); + + ReadLn(f, Width, Height); (* прочитать высоту и ширину *) + SetLength(TheMaze, Width + 1, Height + 1); (* изменить размер лабиринта *) + + for y := 0 to Height do (* Цикл по всем локациям *) + for x := 0 to Width do + if (y = Height) or (x = Width) then (* если локация - служебная *) + begin + TheMaze[x, y].left_wall := true; (* обе стены существуют *) + TheMaze[x, y].up_wall := true + end + else + begin (* иначе считываем *) + ReadLn(f, uw, lw); (* из файла *) + TheMaze[x, y].left_wall := Boolean(lw); (* прочитанное целое *) + TheMaze[x, y].up_wall := Boolean(uw); (* число надо привести *) + end; (* к типу Boolean *) + CloseFile(f); (* Закрыть файл *) +end; + +procedure SaveMaze(TheMaze: Maze; FileName: string); +var f: TextFile; (* файл с описанием лабиринта *) + Height, Width: Integer; (* высота и ширина *) + x, y: Integer; (* координаты текущей локации *) +begin + AssignFile(f, FileName); (* открыать файл *) + Rewrite(f); (* для записи *) + + Height := High(TheMaze[0]); (* определяем высоту *) + Width := High(TheMaze); (* и ширину лабиринта *) + + WriteLn(f, Width, ' ', Height); (* запись в файл высоты и ширины *) + + for y := 0 to Height - 1 do + for x := 0 to Width - 1 do + WriteLn(f, Integer(TheMaze[x, y].up_wall), ' ', + Integer(TheMaze[x, y].left_wall)); + + CloseFile(f); (* закрыть файл *) +end; + +(* служебная функция: определяет, можно ли пройти из локации +(x, y) в локацию (x + dx, y + dy), то есть нет ли между ними стены *) +function CanGo(TheMaze: Maze; x, y, dx, dy: Integer): Boolean; +begin + if dx = -1 then CanGo := not TheMaze[x, y].left_wall + else if dx = 1 then CanGo := not TheMaze[x + 1, y].left_wall + else if dy = -1 then CanGo := not TheMaze[x, y].up_wall + else CanGo := not TheMaze[x, y + 1].up_wall; +end; + +end. + diff --git a/Занимательное программирование/4/4_prim/sample.txt b/Занимательное программирование/4/4_prim/sample.txt new file mode 100644 index 0000000..7ce0c40 --- /dev/null +++ b/Занимательное программирование/4/4_prim/sample.txt @@ -0,0 +1,21 @@ +5 4 +1 1 +1 1 +1 0 +1 1 +1 0 +0 1 +1 0 +0 1 +0 0 +1 1 +0 1 +1 0 +1 0 +0 0 +0 0 +1 1 +0 0 +0 1 +0 1 +0 1 diff --git a/Занимательное программирование/4/4_prim/unit1.lfm b/Занимательное программирование/4/4_prim/unit1.lfm new file mode 100644 index 0000000..d7f553d --- /dev/null +++ b/Занимательное программирование/4/4_prim/unit1.lfm @@ -0,0 +1,69 @@ +object Form1: TForm1 + Left = 322 + Height = 620 + Top = 32 + Width = 856 + Caption = 'Form1' + ClientHeight = 620 + ClientWidth = 856 + DesignTimePPI = 120 + LCLVersion = '4.2.0.0' + object BackBuffer: TImage + Left = 16 + Height = 400 + Top = 8 + Width = 824 + Visible = False + end + object Screen: TImage + Left = 16 + Height = 400 + Top = 8 + Width = 824 + end + object Button1: TButton + Left = 16 + Height = 56 + Top = 440 + Width = 176 + Caption = 'Загрузка/сохранение' + TabOrder = 0 + OnClick = Button1Click + end + object Button2: TButton + Left = 192 + Height = 56 + Top = 440 + Width = 166 + Caption = 'Рекурсивный обход' + TabOrder = 1 + OnClick = Button2Click + end + object Button3: TButton + Left = 360 + Height = 56 + Top = 440 + Width = 176 + Caption = 'Волновая трассировка' + TabOrder = 2 + OnClick = Button3Click + end + object Button4: TButton + Left = 536 + Height = 56 + Top = 440 + Width = 144 + Caption = 'Алгоритм Прима' + TabOrder = 3 + OnClick = Button4Click + end + object Button5: TButton + Left = 680 + Height = 56 + Top = 440 + Width = 160 + Caption = 'Алгоритм Краскала' + TabOrder = 4 + OnClick = Button5Click + end +end diff --git a/Занимательное программирование/4/4_prim/unit1.pas b/Занимательное программирование/4/4_prim/unit1.pas new file mode 100644 index 0000000..e43eb9c --- /dev/null +++ b/Занимательное программирование/4/4_prim/unit1.pas @@ -0,0 +1,513 @@ +unit Unit1; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, + MazeUnit; + +const + CellSize = 50; + +type + + { TForm1 } + + TForm1 = class(TForm) + BackBuffer: TImage; + Button1: TButton; + Button2: TButton; + Button3: TButton; + Button4: TButton; + Button5: TButton; + Screen: TImage; + procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button4Click(Sender: TObject); + procedure Button5Click(Sender: TObject); + private + TheMaze: Maze; + public + + end; + +procedure ShowMaze(TheMaze: Maze); (* нарисовать лабиринт *) +procedure RecursiveSolve(TheMaze: Maze; xs, ys, xf, yf: Integer); +procedure WaveTracingSolve(TheMaze: Maze; xs, ys, xf, yf: Integer); + +var + Form1: TForm1; + +implementation + +{$R *.lfm} + +procedure ShowMaze(TheMaze: Maze); (* нарисовать лабиринт *) +var x, y: Integer; + Height, Width: Integer; (* высота и ширина лабиринта *) +begin + Width := High(TheMaze); (* определить высоту и ширину *) + Height := High(TheMaze[0]); + + Form1.BackBuffer.Canvas.FillRect(Rect(0, 0, Form1.BackBuffer.Width, Form1.BackBuffer.Height)); + for x := 0 to Width - 1 do + for y := 0 to Height - 1 do + begin + (* если в локации есть верхняя стена *) + if TheMaze[x, y].up_wall then + begin + (* рисуем ее *) + Form1.BackBuffer.Canvas.MoveTo(x * CellSize, y * CellSize); + Form1.BackBuffer.Canvas.LineTo((x + 1) * CellSize, y * CellSize) + end; + + (* если в локации есть левая стена *) + if TheMaze[x, y].left_wall then + begin + (* рисуем и ее *) + Form1.BackBuffer.Canvas.MoveTo(x * CellSize, y * CellSize); + Form1.BackBuffer.Canvas.LineTo(x * CellSize, (y + 1) * CellSize) + end + end; + (* рисуем стену снизу и *) + Form1.BackBuffer.Canvas.MoveTo(0, Height * CellSize); + (* справа от лабиринта *) + Form1.BackBuffer.Canvas.LineTo(Width * CellSize, Height * CellSize); + Form1.BackBuffer.Canvas.LineTo(Width * CellSize, 0); + + (* отобразить результат на основном экране *) + Form1.Screen.Canvas.CopyRect( + Rect(0, 0, Form1.Screen.Width, Form1.Screen.Height), + Form1.BackBuffer.Canvas, + Rect(0, 0, Form1.Screen.Width, Form1.Screen.Height)); +end; + +procedure RecursiveSolve(TheMaze: Maze; xs, ys, xf, yf: Integer); +var visited: array of array of Boolean; (* карта посещений локаций *) + x, y, xc, yc: Integer; + i: Integer; + Path: array of TPoint; (* Результирующий маршрут *) + Height, Width: Integer; +const dx: array[1..4] of Integer = (1, 0, -1, 0); (* смещения *) + dy: array[1..4] of Integer = (0, -1, 0, 1); + +(* поиск финишной локации из точки (x, y) *) +function Solve(x, y, depth: Integer): Boolean; +var i: Integer; +begin + Visited[x, y] := true; (* пометить локцию как посещенную *) + Path[depth] := Point(x, y); (* добавить ее в описание маршрута *) + Path[depth + 1] := Point(-1, -1); (* добавить признак конца маршрута *) + + if (x = xf) and (y = yf) then (* если финишная локация найдена *) + begin + Solve := true; (* Конец алгоритма *) + Exit; + end; + + for i := 1 to 4 do + (* если дорожка свободна, идем по ней *) + if CanGo(TheMaze, x, y, dx[i], dy[i]) and not Visited[x + dx[i], y + dy[i]] then + if Solve(x + dx[i], y + dy[i], depth + 1) then + begin + Solve := true; (* если решение найдено *) + Exit; (* конец алгоритма *) + end; + + Visited[x, y] := false; (* пометить локацию как непосещенную *) + Solve := false; (* решение найдено *) +end; + +begin (* главная процедура *) + Width := High(TheMaze); + Height := High(TheMaze[0]); + SetLength(Path, Height * Width + 1); (* выделяем память для маршрута *) + SetLength(Visited, Width, Height); (* и для списка посещенных локаций *) + + for x := 0 to Width - 1 do + for y := 0 to Height - 1 do + Visited[x, y] := false; (* изначально ни одна не посещена *) + + if Solve(xs, ys, 0) then (* если найдено решение, рисуем его *) + begin + i := 0; + while not ((Path[i].x = -1) and (Path[i].y = -1)) do + begin + xc := CellSize * (2 * Path[i].x + 1) div 2; + yc := CellSize * (2 * Path[i].y + 1) div 2; + Form1.Screen.Canvas.Ellipse(xc - 5, yc - 5, xc + 5, yc + 5); + i := i + 1 + end; + end; + +end; + +procedure WaveTracingSolve(TheMaze: Maze; xs, ys, xf, yf: Integer); +var Mark: array of array of Integer; (* метки локаций *) + x, y, xc, yc: Integer; + N, i: Integer; + Height, Width: Integer; +const dx: array[1..4] of Integer = (1, 0, -1, 0); (* смещений *) + dy: array[1..4] of Integer = (0, -1, 0, 1); + +function Solve: Boolean; (* поиск решения *) +var i, N, x, y: Integer; + NoSolution: Boolean; +begin + N := 1; (* начинаем с итерации номер 1 *) + + repeat + NoSolution := true; (* пессимистично полагаем, что решения нет *) + for x := 0 to Width - 1 do + for y := 0 to Height - 1 do + if Mark[x, y] = N then (* найти локации, помеченные числом N *) + for i := 1 to 4 do (* просмотр соседних локаций *) + if CanGo(TheMaze, x, y, dx[i], dy[i]) and (Mark[x + dx[i], y + dy[i]] = 0) then + begin (* локация доступна и помечена нулем *) + NoSolution := false; (* есть шанс найти решение *) + (* помечаем соседнюю локацию числом N + 1 *) + Mark[x + dx[i], y + dy[i]] := N + 1; + if (x + dx[i] = xf) and (y + dy[i] = yf) then + begin + Solve := true; (* дошло до финишной локации *) + Exit; (* конец алгоритма *) + end; + end; + N := N + 1; (* переход к следующей итерации *) + until NoSolution; (* повторять, если есть надежда найти решение *) + + Solve := false; (* нет, решение не найдено *) +end; + +begin + Width := High(TheMaze); + Height := High(TheMaze[0]); + SetLength(Mark, Width, Height); (* выделение памяти для пометок *) + + for x := 0 to Width - 1 do (* изначально все заполняется нулями *) + for y := 0 to Height - 1 do + Mark[x, y] := 0; + + Mark[xs, ys] := 1; (* стартовой локции соответствует единица *) + if Solve then (* если найдено решение, рисуем его *) + begin + x := xf; + y := yf; + for N := Mark[xf, yf] downto 1 do + begin + (* рисуем окружность на очередной локции маршрута *) + xc := CellSize * (2 * x + 1) div 2; + yc := CellSize * (2 * y + 1) div 2; + Form1.Screen.Canvas.Ellipse(xc - 5, yc - 5, xc + 5, yc + 5); + + for i := 1 to 4 do + if CanGo(TheMaze, x, y, dx[i], dy[i]) and (Mark[x + dx[i], y + dy[i]] = N - 1) then + begin + x := x + dx[i]; (* ищем следующую локацию маршрута *) + y := y + dy[i]; + Break; + end; + end; + end; +end; + +(* Генерация лабиринта по алгоритму Прима *) +function PrimGenerateMaze(Width, Height : Integer) : Maze; +type AttrType = (Inside, Outside, Border); (* тип "атрибут локации" *) +var + TheMaze: Maze; (* сам лабиринта *) + x, y, i: Integer; + xc, yc: Integer; + Attribute: array of array of AttrType; (* карта атрибутов *) + IsEnd: Boolean; + counter: Integer; + borders: array of TPoint; + borderToInside: TPoint; +const + dx: array[1..4] of Integer = (1, 0, -1, 0); (* смещения *) + dy : array[1..4] of Integer = (0, -1, 0, 1); + +label ExitFor; (* используемые метки *) + +procedure BreakWall(x, y, dx, dy : Integer); (* разрушить стену *) +begin (* между локациями *) + if dx = -1 then TheMaze[x, y].left_wall := false + else if dx = 1 then TheMaze[x + 1, y].left_wall := false + else if dy = -1 then TheMaze[x, y].up_wall := false + else TheMaze[x, y + 1].up_wall := false; +end; + +begin + borders := nil; + SetLength(Attribute, Width, Height); (* выделение памяти для атрибутов *) + SetLength(TheMaze, Width + 1, Height + 1); (* изменить размер лабиринта *) + + for x := 0 to Width - 1 do (* изначально все атрибуты *) + for y := 0 to Height - 1 do (* равны Outside *) + Attribute[x, y] := Outside; + + for y := 0 to Height do (* все стены изначально *) + for x := 0 to Width do (* существуют *) + begin + TheMaze[x, y].left_wall := true; + TheMaze[x, y].up_wall := true; + end; + + Randomize; + x := Random(Width); (* выбираем начальную локацию *) + y := Random(Height); + Attribute[x, y] := Inside; (* и присваиваем ей атрибут Inside *) + + for i := 1 to 4 do (* всем ее соседям присваиваем *) + begin (* атрибут Border *) + xc := x + dx[i]; + yc := y + dy[i]; + if (xc >= 0) and (yc >= 0) and (xc < Width) and (yc < Height) then + begin + SetLength(borders, Length(borders) + 1); + borders[Length(borders) - 1].X := xc; + borders[Length(borders) - 1].Y := yc; + Attribute[xc, yc] := Border + end + end; + + repeat (* главный цикл *) + IsEnd := true; + counter := Length(borders); + + (* Выбираем из них одну случайную. *) + counter := Random(counter); + borderToInside := borders[counter]; + + (* Удаляем локацию с атрибутом Border из списка. *) + Move(borders[counter + 1], borders[counter], SizeOf(TPoint) * (Length(borders) - counter - 1)); + SetLength(borders, Length(borders) - 1); + + (* Присвоить ей атрибут Inside. *) + Attribute[borderToInside.X, borderToInside.Y] := Inside; + + counter := 0; + for i := 1 to 4 do + begin + xc := borderToInside.X + dx[i]; + yc := borderToInside.Y + dy[i]; + if (xc >= 0) and (yc >= 0) and (xc < Width) and (yc < Height) then + begin (* подсчитать количество локаций с атрибутом Inside *) + if Attribute[xc, yc] = Inside then counter := counter + 1; + if Attribute[xc, yc] = Outside then + begin + (* Заменить атрибуты с Outside на Border. *) + SetLength(borders, Length(borders) + 1); + borders[Length(borders) - 1].X := xc; + borders[Length(borders) - 1].Y := yc; + Attribute[xc, yc] := Border; + end + end; + end; + + counter := Random(counter) + 1; (* выбрать случайную Inside-локацию *) + for i := 1 to 4 do + begin + xc := borderToInside.X + dx[i]; + yc := borderToInside.Y + dy[i]; + if (xc >= 0) and (yc >= 0) and (xc < Width) and (yc < Height) + and (Attribute[xc, yc] = Inside) then + begin + counter := counter - 1; + if counter = 0 then (* разрушить стену между ней и *) + begin (* текущей локацией *) + BreakWall(borderToInside.X, borderToInside.y, dx[i], dy[i]); + goto ExitFor + end; + end; + end; + +ExitFor: + (* Определить, есть ли хоть одна локация с атрибутом Border. *) + if Length(borders) > 0 then + begin + (* Если да, продолжаем выполнять алгоритм. *) + IsEnd := false + end; + + ShowMaze(TheMaze); (* отобразить процесс генерации *) + Application.ProcessMessages; + until IsEnd; + PrimGenerateMaze := TheMaze; +end; + +(* Генерация лабиринта по алгоритму Краскала *) +function KruskalGenerateMaze(Width, Height : Integer) : Maze; +type Wall = record (* тип "стена" *) + x, y, dx, dy : Integer; +end; +var TheMaze: Maze; (* сам лабиринт *) + Walls: array of Wall; (* массив стен *) + Temp: array of Real; (* временный массив для сортироваки стен *) + i, j: Integer; + tempw: Wall; + tempr: Real; + CurWall: Wall; + locations: Integer; + counter: Integer; + +procedure BreakWall(x, y, dx, dy : Integer); (* разрушить стену *) +begin (* между локациями *) + if dx = -1 then TheMaze[x, y].left_wall := false + else if dx = 1 then TheMaze[x + 1, y].left_wall := false + else if dy = -1 then TheMaze[x, y].up_wall := false + else TheMaze[x, y + 1].up_wall := false; +end; + +function IsConnected(xs, ys, xf, yf : Integer) : Boolean; +(* используем алгоритм волновой трассировки *) +var Mark: array of array of Integer; + x, y: Integer; + Height, Width: Integer; +const dx : array[1..4] of Integer = (1, 0, -1, 0); + dy : array[1..4] of Integer = (0, -1, 0, 1); + +function CanGo(x, y, dx, dy : Integer) : Boolean; +begin + if dx = -1 then CanGo := not TheMaze[x, y].left_wall + else if dx = 1 then CanGo := not TheMaze[x + 1, y].left_wall + else if dy = -1 then CanGo := not TheMaze[x, y].up_wall + else CanGo := not TheMaze[x, y + 1].up_wall; +end; + +function Solve : Boolean; +var i, N, x, y : Integer; + NoSolution : Boolean; +begin + N := 1; + + repeat + NoSolution := true; + for x := 0 to Width - 1 do + for y := 0 to Height - 1 do + if Mark[x, y] = N then + for i := 1 to 4 do + if CanGo(x, y, dx[i], dy[i]) and (Mark[x + dx[i], y + dy[i]] = 0) then + begin + NoSolution := false; + + Mark[x + dx[i], y + dy[i]] := N + 1; + if (x + dx[i] = xf) and (y + dy[i] = yf) then + begin + Solve := true; + Exit; + end; + end; + N := N + 1; + until NoSolution; + + Solve := false; +end; + +begin + Width := High(TheMaze); + Height := High(TheMaze[0]); + SetLength(Mark, Width, Height); + + for x := 0 to Width - 1 do + for y := 0 to Height - 1 do + Mark[x, y] := 0; + + Mark[xs, ys] := 1; + IsConnected := Solve; +end; + +begin + (* выделение памяти для массива стен + в лабиринте Width * Height изначально + (Width - 1) * Height + (Height - 1) * Width стен *) + SetLength(Walls, (Width - 1) * Height + (Height - 1) * Width); + SetLength(Temp, (Width - 1) * Height + (Height - 1) * Width); + SetLength(TheMaze, Width + 1, Height + 1); (* указать размер лабиринта *) + + for i := 0 to Width do (* все стены изначально *) + for j := 0 to Height do (* существуют *) + begin + TheMaze[i, j].left_wall := true; + TheMaze[i, j].up_wall := true; + end; + + Randomize; + for i := 0 to (Width - 1) * Height + (Height - 1) * Width - 1 do + Temp[i] := Random; (* заполнение массива Temp случайными числами *) + + counter := 0; (* заполнение массива стен *) + for i := 1 to Width - 1 do + for j := 0 to Height - 1 do + begin (* сначала все горизонтальные *) + Walls[counter].x := i; Walls[counter].y := j; + Walls[counter].dx := -1; Walls[counter].dy := 0; + counter := counter + 1; + end; + for i := 0 to Width - 1 do + for j := 1 to Height - 1 do + begin (* затем все вертикальные *) + Walls[counter].x := i; Walls[counter].y := j; + Walls[counter].dx := 0; Walls[counter].dy := -1; + counter := counter + 1; + end; + + for i := 0 to (Width - 1) * Height + (Height - 1) * Width - 1 do + for j := i to (Width - 1) * Height + (Height - 1) * Width - 1 do + if Temp[i] > Temp[j] then (* перемешиваем массив стен *) + begin + tempr := Temp[i]; Temp[i] := Temp[j]; Temp[j] := tempr; + tempw := Walls[i]; Walls[i] := Walls[j]; Walls[j] := tempw; + end; + + locations := Width * Height; + i := 0; + while locations > 1 do (* прямолинейная реализация *) + begin (* алгоритма Краскала *) + CurWall := Walls[i]; + i := i + 1; + if not IsConnected(CurWall.x, CurWall.y, CurWall.x + CurWall.dx, CurWall.y + CurWall.dy) then + begin + BreakWall(CurWall.x, CurWall.y, CurWall.dx, CurWall.dy); + locations := locations - 1; + ShowMaze(TheMaze); + Application.ProcessMessages; + end; + end; + + KruskalGenerateMaze := TheMaze; +end; + +{ TForm1 } + +procedure TForm1.Button1Click(Sender: TObject); +begin + LoadMaze(TheMaze, 'sample.txt'); + ShowMaze(TheMaze) +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + RecursiveSolve(TheMaze, 0, 0, 4, 0) +end; + +procedure TForm1.Button3Click(Sender: TObject); +begin + WaveTracingSolve(TheMaze, 0, 0, 4, 0) +end; + +procedure TForm1.Button4Click(Sender: TObject); +begin + PrimGenerateMaze(30, 18) +end; + +procedure TForm1.Button5Click(Sender: TObject); +begin + KruskalGenerateMaze(30, 18) +end; + +end. + diff --git a/Занимательное программирование/README.txt b/Занимательное программирование/README.txt index a6a1e19..2b03ec7 100644 --- a/Занимательное программирование/README.txt +++ b/Занимательное программирование/README.txt @@ -5,5 +5,7 @@ Pascal или Delphi, в моем случае это Free Pascal и Lazarus. В первой главе ("Компьютерное моделирование") есть один С файл (для рисования применяется Cairo). -Вторая ("Анимация и графические эффекты") и четвертая ("Трехмерная -графика") главы основывается на Java и игровом движке libGDX. +Вторая глава ("Анимация и графические эффекты") основывается на Java и +игровом движке libGDX. + +Четвертая глава ("Трехмерная графика") сделана с Pascal и libGDX.