PATH.PAS 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. Program Voland8;
  2. Uses Crt,Graph;
  3. Const
  4. FirstX = 15;
  5. FirstY = 25;
  6. Var
  7. Q:Byte;
  8. M:Array[0..9,0..9] Of Integer;
  9. KolFields:Byte;
  10. I,J:Byte;
  11. Min:Byte;
  12. GD,GM:Integer;
  13. Field:Byte;
  14. Change:Boolean;
  15. Procedure RandomFill(PersentInp:Byte);
  16. Var
  17. Persent:Byte;
  18. Color:Byte;
  19. Begin
  20. Randomize;
  21. Persent:=0;
  22. While Persent < PersentInp Do
  23. Begin
  24. I:=Random(8)+1;
  25. J:=Random(8)+1;
  26. If M[I,J] = 0 Then
  27. Begin
  28. M[I,J]:=-1;
  29. Persent:=Persent+1;
  30. End;
  31. End;
  32. SetColor(15);
  33. For I:=0 To 8 Do
  34. Begin
  35. Line(FirstX+21*I,FirstY,FirstX+21*I,FirstY+8*21);
  36. Line(FirstX,FirstY+21*I,FirstX+8*21,FirstY+21*I);
  37. End;
  38. SetFillStyle(1,12);
  39. For I:=1 To 8 Do
  40. For J:=1 To 8 Do
  41. If M[I,J]<>0 Then
  42. Bar(FirstX+21*(I-1)+1,FirstY+21*(J-1)+1,FirstX+21*(I-1)+20-1,FirstY+21*
  43. (J-1)+20-1);
  44. End;
  45. Procedure Ok;
  46. Begin
  47. OutTextXY(450,400,'Пройти можно.');
  48. End;
  49. Procedure NotOk;
  50. Begin
  51. OutTextXY(450,400,'Пройти нельзя.');
  52. ReadKey;
  53. CloseGraph;
  54. Halt;
  55. End;
  56. Procedure Check(X,Y:Byte);
  57. Var
  58. Min:Byte;
  59. Begin
  60. If M[X,Y] = -1 Then
  61. Begin
  62. Min:=255;
  63. If (M[X-1,Y]>0) And (M[X-1,Y]<Min) Then
  64. Min:=M[X-1,Y];
  65. If (M[X+1,Y]>0) And (M[X+1,Y]<Min) Then
  66. Min:=M[X+1,Y];
  67. If (M[X,Y-1]>0) And (M[X,Y-1]<Min) Then
  68. Min:=M[X,Y-1];
  69. If (M[X,Y+1]>0) And (M[X,Y+1]<Min) Then
  70. Min:=M[X,Y+1];
  71. If Min<255 Then
  72. Begin
  73. M[X,Y]:=Min+1;
  74. Change:=True;
  75. End;
  76. End;
  77. End;
  78. Procedure Find(X,Y:Byte);
  79. Begin
  80. Delay(200);
  81. Bar(FirstX+21*(X-1)+1,FirstY+21*(Y-1)+1,FirstX+21*(X-1)+20-1,FirstY+21*(Y-1)+
  82. 20-1);
  83. If X>1 Then
  84. If M[X-1,Y]=M[X,Y]-1 Then
  85. Find(X-1,Y)
  86. Else
  87. If M[X,Y-1]=M[X,Y]-1 Then
  88. Find(X,Y-1)
  89. Else
  90. If M[X+1,Y]=M[X,Y]-1 Then
  91. Find(X+1,Y)
  92. Else
  93. If M[X,Y+1]=M[X,Y]-1 Then
  94. Find(X,Y+1);
  95. End;
  96. Begin
  97. ClrScr;
  98. Write('Введите процент заполнения<<<---');
  99. ReadLn(KolFields);
  100. KolFields:=Round((KolFields/100)*64);
  101. GD:=Detect;
  102. InitGraph(GD,GM,'c:\bp\bgi');
  103. SetFillStyle(1,5);
  104. Bar(1,1,GetMaxX,GetMaxY);
  105. SetFillStyle(1,0);
  106. Bar(FirstX,FirstY,FirstX+8*21,FirstY+8*21);
  107. For I:=1 To 8 Do
  108. For J:=1 to 8 Do
  109. M[I,J]:=0;
  110. RandomFill(KolFields);
  111. For I:=1 To 8 Do
  112. If M[1,I]=-1 Then M[1,I]:=1;
  113. Repeat
  114. Change:=False;
  115. For I:=2 to 8 Do
  116. For J:=1 To 8 Do
  117. Check(I,J);
  118. Until Not Change;
  119. Field:=0;
  120. Min:=255;
  121. For I:=8 DownTo 1 Do
  122. If (M[8,I]<=Min) And (M[8,I]>0) Then
  123. Begin
  124. Field:=I;
  125. Min:=M[8,I];
  126. End;
  127. If Field = 0 Then
  128. NotOk
  129. Else
  130. Ok;
  131. Delay(400);
  132. SetFillStyle(1,14);
  133. Find(8,Field);
  134. ReadKey;
  135. End.