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 14248KB
stdin
25
25
0.25
1.5
т
stdout
=== Поля і каміння — пошук довгого простого шляху
Введіть кількість рядків N (1..100): Введіть кількість стовпців M (1..100): Ймовірність каменю в клітинці (0..1), наприклад 0.25: Часовий ліміт пошуку в секундах (наприклад 1.5): Якщо потрібно — регенерувати поле поки існує шлях? (т/н) [т]: 
Згенероване поле (вирівняне):

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

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

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

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


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