fork download
  1. import random
  2. import time
  3. import sys
  4.  
  5. sys.setrecursionlimit(10000)
  6.  
  7. def generate_field(N, M, p):
  8. grid = [[1 if random.random() < p else 0 for _ in range(M)] for _ in range(N)]
  9. grid[N-1][0] = 0 # старт (лівий нижній)
  10. grid[0][M-1] = 0 # фініш (правий верхній)
  11. return grid
  12.  
  13. from collections import deque
  14. def exists_path_bfs(grid):
  15. N, M = len(grid), len(grid[0])
  16. start = (N-1,0)
  17. goal = (0, M-1)
  18. if grid[start[0]][start[1]] != 0 or grid[goal[0]][goal[1]] != 0:
  19. return False
  20. q = deque([start])
  21. vis = [[False]*M for _ in range(N)]
  22. vis[start[0]][start[1]] = True
  23. dirs = [(1,0),(-1,0),(0,1),(0,-1)]
  24. while q:
  25. r,c = q.popleft()
  26. if (r,c) == goal:
  27. return True
  28. for dr,dc in dirs:
  29. nr, nc = r+dr, c+dc
  30. if 0 <= nr < N and 0 <= nc < M and not vis[nr][nc] and grid[nr][nc] == 0:
  31. vis[nr][nc] = True
  32. q.append((nr,nc))
  33. return False
  34.  
  35. def longest_path_dfs(grid, time_limit=1.5, randomize=True):
  36. N, M = len(grid), len(grid[0])
  37. start = (N-1, 0)
  38. goal = (0, M-1)
  39. dirs = [(1,0), (0,1), (-1,0), (0,-1)]
  40. best_path = None
  41. best_len = -1
  42. start_time = time.time()
  43. max_nodes = 10**6
  44. nodes = 0
  45.  
  46. import random as _rnd
  47.  
  48. visited = [[False]*M for _ in range(N)]
  49. path = []
  50.  
  51. def dfs(r,c):
  52. nonlocal best_len, best_path, nodes
  53. if time.time() - start_time > time_limit:
  54. return
  55. nodes += 1
  56. if nodes > max_nodes:
  57. return
  58.  
  59. if (r,c) == goal:
  60. if len(path) > best_len:
  61. best_len = len(path)
  62. best_path = path.copy()
  63. return
  64.  
  65. neighs = []
  66. for dr,dc in dirs:
  67. nr, nc = r+dr, c+dc
  68. if 0 <= nr < N and 0 <= nc < M and not visited[nr][nc] and grid[nr][nc] == 0:
  69. dist = abs(nr - goal[0]) + abs(nc - goal[1])
  70. neighs.append((dist, nr, nc))
  71. neighs.sort(reverse=True, key=lambda x: x[0])
  72. if randomize:
  73. i = 0
  74. while i < len(neighs):
  75. j = i
  76. while j < len(neighs) and neighs[j][0] == neighs[i][0]:
  77. j += 1
  78. block = neighs[i:j]
  79. _rnd.shuffle(block)
  80. neighs[i:j] = block
  81. i = j
  82.  
  83. for _, nr, nc in neighs:
  84. if time.time() - start_time > time_limit:
  85. return
  86. visited[nr][nc] = True
  87. path.append((nr,nc))
  88. dfs(nr,nc)
  89. path.pop()
  90. visited[nr][nc] = False
  91.  
  92. if grid[start[0]][start[1]] != 0 or grid[goal[0]][goal[1]] != 0:
  93. return None
  94.  
  95. visited[start[0]][start[1]] = True
  96. path.append(start)
  97. dfs(start[0], start[1])
  98. visited[start[0]][start[1]] = False
  99. path.pop()
  100.  
  101. return best_path
  102.  
  103.  
  104. def print_board_numbered(grid, path):
  105. N, M = len(grid), len(grid[0])
  106. step = {}
  107. if path:
  108. for i, cell in enumerate(path):
  109. step[cell] = i
  110.  
  111. max_step = max(step.values()) if step else 0
  112. width = max(3, len(str(max_step)) + 2)
  113.  
  114. def cell_str(s):
  115. return str(s).center(width)
  116.  
  117. print()
  118. for r in range(N):
  119. row_cells = []
  120. for c in range(M):
  121. if (r,c) in step:
  122. row_cells.append(cell_str(step[(r,c)]))
  123. elif grid[r][c] == 1:
  124. row_cells.append(cell_str("#"))
  125. else:
  126. row_cells.append(cell_str("."))
  127. print("".join(row_cells))
  128. print()
  129.  
  130.  
  131. def main():
  132. print("=== Поля і каміння — пошук довгого простого шляху")
  133. try:
  134. N = int(input("Введіть кількість рядків N (1..100): ").strip())
  135. M = int(input("Введіть кількість стовпців M (1..100): ").strip())
  136. except Exception:
  137. print("Некоректні N або M.")
  138. return
  139. if not (1 <= N <= 100 and 1 <= M <= 100):
  140. print("N і M повинні бути від 1 до 100.")
  141. return
  142.  
  143. try:
  144. p = float(input("Ймовірність каменю в клітинці (0..1), наприклад 0.25: ").strip())
  145. if not (0.0 <= p <= 1.0):
  146. raise ValueError()
  147. except Exception:
  148. print("Некоректне p — використовую 0.25")
  149. p = 0.25
  150.  
  151. try:
  152. tlim = float(input("Часовий ліміт пошуку в секундах (наприклад 1.5): ").strip())
  153. if tlim <= 0:
  154. tlim = 1.5
  155. except Exception:
  156. tlim = 1.5
  157.  
  158. regen = input("Якщо потрібно — регенерувати поле поки існує шлях? (т/н) [т]: ").strip().lower()
  159. regen_flag = (regen == "" or regen == "т" or regen == "y" or regen == "yes")
  160.  
  161. attempts = 0
  162. while True:
  163. attempts += 1
  164. grid = generate_field(N, M, p)
  165. if exists_path_bfs(grid):
  166. break
  167. if not regen_flag:
  168. break
  169. if attempts > 2000:
  170. print("Не вдалось згенерувати поле з шляхом за багато спроб. Спробуйте змінити p.")
  171. return
  172.  
  173. print("\nЗгенероване поле (вирівняне):")
  174. print_board_numbered(grid, None)
  175.  
  176. if not exists_path_bfs(grid):
  177. print("Шляху немає — завершую.")
  178. return
  179.  
  180. print(f"Починаємо пошук найдовшого простого шляху (таймаут = {tlim} сек)...")
  181. best = longest_path_dfs(grid, time_limit=tlim, randomize=True)
  182.  
  183. if not best:
  184. print("Не знайдено жодного шляху (неочікувано).")
  185. return
  186.  
  187. print(f"Знайдений шлях довжиною {len(best)} (0 = старт).")
  188. print("\nКарта з пронумерованим шляхом:")
  189. print_board_numbered(grid, best)
  190.  
  191. print("\nКроки шляху (1-based координати):")
  192. print([(r+1, c+1) for (r,c) in best])
  193.  
  194. if __name__ == "__main__":
  195. main()
Success #stdin #stdout 1.63s 14240KB
stdin
25
25
0.25
1.5
т
stdout
=== Поля і каміння — пошук довгого простого шляху
Введіть кількість рядків N (1..100): Введіть кількість стовпців M (1..100): Ймовірність каменю в клітинці (0..1), наприклад 0.25: Часовий ліміт пошуку в секундах (наприклад 1.5): Якщо потрібно — регенерувати поле поки існує шлях? (т/н) [т]: 
Згенероване поле (вирівняне):

 .  .  .  #  .  .  .  .  .  .  .  #  .  .  .  .  .  .  #  .  .  .  #  .  . 
 #  #  .  .  #  .  .  .  #  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  . 
 .  .  .  .  .  .  .  .  .  #  .  #  #  .  #  .  .  #  #  .  #  #  .  .  . 
 .  .  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .  .  .  #  .  .  .  .  # 
 .  .  #  .  .  .  .  #  .  .  #  #  .  #  #  #  #  #  .  .  .  .  .  .  # 
 .  .  .  .  .  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .  .  #  . 
 #  .  #  .  .  .  #  .  .  .  .  #  .  .  #  .  #  #  #  #  #  #  .  #  . 
 .  .  .  .  .  .  #  .  .  .  .  .  #  #  #  .  .  #  #  .  .  .  .  .  # 
 .  .  .  .  #  #  .  .  .  .  .  .  .  .  .  .  #  .  #  .  .  .  .  .  . 
 .  .  .  .  .  #  .  .  #  .  #  .  #  .  .  .  .  .  .  .  #  #  .  .  . 
 .  .  #  .  .  #  .  .  .  .  #  .  .  .  .  .  .  #  .  .  .  #  .  #  . 
 .  #  .  #  .  .  #  .  .  .  .  .  #  .  #  #  .  .  #  .  .  .  .  .  . 
 #  #  .  .  #  .  .  #  #  .  #  .  .  .  .  .  #  .  #  .  #  .  .  .  . 
 .  .  .  .  .  #  #  .  .  .  .  #  .  .  .  .  .  .  .  #  .  .  .  .  # 
 #  .  #  #  .  .  .  .  #  .  .  #  #  .  .  .  .  #  .  .  .  #  #  .  . 
 #  .  .  .  .  #  #  .  #  #  .  .  .  .  .  .  .  .  .  #  .  .  .  #  # 
 .  .  .  .  .  #  .  #  .  .  #  .  .  .  .  .  #  .  .  #  .  .  .  .  . 
 #  .  .  .  #  .  .  .  .  .  #  .  .  .  #  .  .  .  .  .  .  #  .  #  # 
 .  #  .  .  .  .  #  #  .  #  .  .  .  .  .  .  .  .  .  .  .  .  .  #  . 
 #  .  .  .  .  #  .  #  #  .  #  #  #  .  .  .  .  .  .  .  .  .  #  .  # 
 .  .  #  .  .  .  #  .  .  .  .  .  .  .  #  .  .  .  .  .  #  .  .  .  . 
 .  .  .  .  #  .  .  .  .  .  .  #  #  .  .  .  .  .  #  #  .  #  #  .  . 
 .  .  .  .  .  .  .  .  .  .  #  #  #  #  .  .  .  #  #  .  .  .  #  .  # 
 .  #  #  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .  #  .  #  .  #  . 
 .  #  #  .  .  .  .  .  .  #  #  #  .  #  .  #  .  .  .  .  #  .  .  .  # 

Починаємо пошук найдовшого простого шляху (таймаут = 1.5 сек)...
Знайдений шлях довжиною 285 (0 = старт).

Карта з пронумерованим шляхом:

  .    .    .    #    .    .    .   159  160  161   .    #    .    .   256  257  258  259   #   263  264   .    #   283  284 
  #    #    .    .    #   152  153  158   #   162  163  164  165  166  255  254   #   260  261  262  265  266  267  282  281 
 138  139  140   .   150  151  154  157   .    #    .    #    #   167   #   253   .    #    #    .    #    #   268  279  280 
 137  136  141  142  149  148  155  156   #    .    #    .   169  168   .   252  251  250  249   #   271  270  269  278   #  
 134  135   #   143  146  147   .    #    .    .    #    #   170   #    #    #    #    #   248  247  272   .   276  277   #  
 133  132   .   144  145  120  119  118  175  174  173  172  171   #    .   242  243  244  245  246  273  274  275   #    .  
  #   131   #    .   122  121   #   117  176  181  182   #    .    .    #   241   #    #    #    #    #    #    .    #    .  
 129  130  125  124  123   .    #   116  177  180  183   .    #    #    #   240   .    #    #    .    .    .    .    .    #  
 128  127  126   .    #    #   114  115  178  179  184  185   .   237  238  239   #    .    #    .    .    .    .    .    .  
  .    .    .    .    .    #   113   .    #    .    #   186   #   236  235   .   231  230  229   .    #    #    .    .    .  
  .    .    #    .    .    #   112  111   .    .    #   187  188  189  234  233  232   #   228  227   .    #    .    #    .  
  .    #    .    #    .    .    #   110  109  108  107  106   #   190   #    #    .    .    #   226  225  224   .    .    .  
  #    #    40   41   #    .    .    #    #    .    #   105  104  191  192   .    #    .    #    .    #   223   .    .    .  
  .    38   39   42   43   #    #    48   49   50   .    #   103  102  193  194  199  200  201   #   221  222   .    .    #  
  #    37   #    #    44   45   46   47   #    51   52   #    #   101  100  195  198   #   202   .   220   #    #    .    .  
  #    36   .    .    .    #    #    .    #    #    53   54   97   98   99  196  197  204  203   #   219   .    .    #    #  
  .    35   .    .    .    #    .    #    .    .    #    55   96   93   92   91   #   205  206   #   218  217  216   .    .  
  #    34   33   32   #    .    .    .    .    .    #    56   95   94   #    90   89   88  207  208   .    #   215   #    #  
  .    #    30   31   .    .    #    #    .    #    .    57   58   59   76   77   78   87   86  209  210  213  214   #    .  
  #    .    29   28   .    #    .    #    #    .    #    #    #    60   75   74   79   80   85   84  211  212   #    .    #  
  .    .    #    27   26   25   #    .    .    .    .    .    .    61   #    73   72   81   82   83   #    .    .    .    .  
  3    4    7    8    #    24   23   .    .    .    .    #    #    62   63   70   71   .    #    #    .    #    #    .    .  
  2    5    6    9    20   21   22   .    .    .    #    #    #    #    64   69   68   #    #    .    .    .    #    .    #  
  1    #    #    10   19   18   17   16   .    .    #    .    .    .    65   66   67   .    .    #    .    #    .    #    .  
  0    #    #    11   12   13   14   15   .    #    #    #    .    #    .    #    .    .    .    .    #    .    .    .    #  


Кроки шляху (1-based координати):
[(25, 1), (24, 1), (23, 1), (22, 1), (22, 2), (23, 2), (23, 3), (22, 3), (22, 4), (23, 4), (24, 4), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (24, 8), (24, 7), (24, 6), (24, 5), (23, 5), (23, 6), (23, 7), (22, 7), (22, 6), (21, 6), (21, 5), (21, 4), (20, 4), (20, 3), (19, 3), (19, 4), (18, 4), (18, 3), (18, 2), (17, 2), (16, 2), (15, 2), (14, 2), (14, 3), (13, 3), (13, 4), (14, 4), (14, 5), (15, 5), (15, 6), (15, 7), (15, 8), (14, 8), (14, 9), (14, 10), (15, 10), (15, 11), (16, 11), (16, 12), (17, 12), (18, 12), (19, 12), (19, 13), (19, 14), (20, 14), (21, 14), (22, 14), (22, 15), (23, 15), (24, 15), (24, 16), (24, 17), (23, 17), (23, 16), (22, 16), (22, 17), (21, 17), (21, 16), (20, 16), (20, 15), (19, 15), (19, 16), (19, 17), (20, 17), (20, 18), (21, 18), (21, 19), (21, 20), (20, 20), (20, 19), (19, 19), (19, 18), (18, 18), (18, 17), (18, 16), (17, 16), (17, 15), (17, 14), (18, 14), (18, 13), (17, 13), (16, 13), (16, 14), (16, 15), (15, 15), (15, 14), (14, 14), (14, 13), (13, 13), (13, 12), (12, 12), (12, 11), (12, 10), (12, 9), (12, 8), (11, 8), (11, 7), (10, 7), (9, 7), (9, 8), (8, 8), (7, 8), (6, 8), (6, 7), (6, 6), (7, 6), (7, 5), (8, 5), (8, 4), (8, 3), (9, 3), (9, 2), (9, 1), (8, 1), (8, 2), (7, 2), (6, 2), (6, 1), (5, 1), (5, 2), (4, 2), (4, 1), (3, 1), (3, 2), (3, 3), (4, 3), (4, 4), (5, 4), (6, 4), (6, 5), (5, 5), (5, 6), (4, 6), (4, 5), (3, 5), (3, 6), (2, 6), (2, 7), (3, 7), (4, 7), (4, 8), (3, 8), (2, 8), (1, 8), (1, 9), (1, 10), (2, 10), (2, 11), (2, 12), (2, 13), (2, 14), (3, 14), (4, 14), (4, 13), (5, 13), (6, 13), (6, 12), (6, 11), (6, 10), (6, 9), (7, 9), (8, 9), (9, 9), (9, 10), (8, 10), (7, 10), (7, 11), (8, 11), (9, 11), (9, 12), (10, 12), (11, 12), (11, 13), (11, 14), (12, 14), (13, 14), (13, 15), (14, 15), (14, 16), (15, 16), (16, 16), (16, 17), (15, 17), (14, 17), (14, 18), (14, 19), (15, 19), (16, 19), (16, 18), (17, 18), (17, 19), (18, 19), (18, 20), (19, 20), (19, 21), (20, 21), (20, 22), (19, 22), (19, 23), (18, 23), (17, 23), (17, 22), (17, 21), (16, 21), (15, 21), (14, 21), (14, 22), (13, 22), (12, 22), (12, 21), (12, 20), (11, 20), (11, 19), (10, 19), (10, 18), (10, 17), (11, 17), (11, 16), (11, 15), (10, 15), (10, 14), (9, 14), (9, 15), (9, 16), (8, 16), (7, 16), (6, 16), (6, 17), (6, 18), (6, 19), (6, 20), (5, 20), (5, 19), (4, 19), (4, 18), (4, 17), (4, 16), (3, 16), (2, 16), (2, 15), (1, 15), (1, 16), (1, 17), (1, 18), (2, 18), (2, 19), (2, 20), (1, 20), (1, 21), (2, 21), (2, 22), (2, 23), (3, 23), (4, 23), (4, 22), (4, 21), (5, 21), (6, 21), (6, 22), (6, 23), (5, 23), (5, 24), (4, 24), (3, 24), (3, 25), (2, 25), (2, 24), (1, 24), (1, 25)]