nq1s788

18 жуткая

Mar 16th, 2026
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.25 KB | None | 0 0
  1. def find_max(start):
  2.     global n, no_left, no_up, field_max
  3.     answ = [[0 for i in range(n)] for j in range(n)]
  4.     answ[start[0]][start[1]] = field_max[start[0]][start[1]]
  5.     for i in range(start[0], n):
  6.         for j in range(start[1], n):
  7.             if (i, j) == start:
  8.                 continue
  9.             if (i, j) in no_left:
  10.                 answ[i][j] = answ[i - 1][j] + field_max[i][j]
  11.             elif (i, j) in no_up:
  12.                 answ[i][j] = answ[i][j - 1] + field_max[i][j]
  13.             else:
  14.                 answ[i][j] = max(answ[i][j - 1], answ[i - 1][j]) + field_max[i][j]
  15.     current = (n - 1, n - 1)
  16.     while current != start:
  17.         field_max[current[0]][current[1]] = 0
  18.         if current in no_left:
  19.             current = (current[0] - 1, current[1])
  20.         elif current in no_up:
  21.             current = (current[0], current[1] - 1)
  22.         elif answ[current[0] - 1][current[1]] >= answ[current[0]][current[1] - 1]:
  23.             current = (current[0] - 1, current[1])
  24.         else:
  25.             current = (current[0], current[1] - 1)
  26.     field_max[start[0]][start[1]] = 0
  27.     return answ[n - 1][n - 1]
  28.  
  29. def find_min(start):
  30.     global n, no_left, no_up
  31.     answ = [[0 for i in range(n)] for j in range(n)]
  32.     answ[start[0]][start[1]] = field_min[start[0]][start[1]]
  33.     for i in range(start[0], n):
  34.         for j in range(start[1], n):
  35.             if (i, j) == start:
  36.                 continue
  37.             if (i, j) in no_left:
  38.                 answ[i][j] = answ[i - 1][j] + field_min[i][j]
  39.             elif (i, j) in no_up:
  40.                 answ[i][j] = answ[i][j - 1] + field_min[i][j]
  41.             else:
  42.                 answ[i][j] = min(answ[i][j - 1], answ[i - 1][j]) + field_min[i][j]
  43.     current = (n - 1, n - 1)
  44.     while current != start:
  45.         field_min[current[0]][current[1]] = 10000000
  46.         if current in no_left:
  47.             current = (current[0] - 1, current[1])
  48.         elif current in no_up:
  49.             current = (current[0], current[1] - 1)
  50.         elif answ[current[0] - 1][current[1]] <= answ[current[0]][current[1] - 1]:
  51.             current = (current[0] - 1, current[1])
  52.         else:
  53.             current = (current[0], current[1] - 1)
  54.     field_min[start[0]][start[1]] = 10000000
  55.     return answ[n - 1][n - 1]
  56.  
  57.  
  58. no_left_raw = [(0, (1, 19)), (1, (2, 12)), (2, (9, 12)), (3, (3, 4)), (5, (12, 16)), (6, (4, 7)), (7, (10, 16)), (10, (3, 4)), (10, (13, 17)), (11, (13, 16)), (13, (3, 9)), (16, (2, 4)), (16, (10, 18)), (18, (8, 16))]
  59. no_up_raw = [(0, (1, 19)), (1, (2, 5)), (8, (3, 3)), (3, (7, 8)), (9, (8, 8)), (18, (9, 9)), (15, (12, 14)), (19, (14, 5)), (5, (16, 16)), (16, (17, 17))]
  60. no_left = set()
  61. for e in no_left_raw:
  62.     for x in range(e[1][0], e[1][1] + 1):
  63.         no_left.add((x, e[0]))
  64. no_up = set()
  65. for e in no_up_raw:
  66.     for y in range(e[1][0], e[1][1] + 1):
  67.         no_left.add((e[0], y))
  68. start = [(0, 0), (1, 1), (2, 3), (2, 10), (2, 13), (3, 6), (8, 2), (9, 7), (11, 5), (12, 11)]
  69. a = open('18.txt').readlines()
  70. n = len(a)
  71. for i in range(n):
  72.     a[i] = list(map(int, a[i].split()))
  73. answ_mx = 0
  74. answ_mn = 100000000000
  75. for st1 in start:
  76.     for st2 in start:
  77.         if st2 == st1:
  78.             continue
  79.         for st3 in start:
  80.             if st3 in [st1, st2]:
  81.                 continue
  82.             for st4 in start:
  83.                 if st4 in [st1, st2, st3]:
  84.                     continue
  85.                 for st5 in start:
  86.                     if st5 in [st1, st2, st3, st4]:
  87.                         continue
  88.                     field_max = [[0 for i in range(n)] for j in range(n)]
  89.                     for i in range(n):
  90.                         for j in range(n):
  91.                             field_max[i][j] = a[i][j]
  92.                     field_min = [[0 for i in range(n)] for j in range(n)]
  93.                     for i in range(n):
  94.                         for j in range(n):
  95.                             field_min[i][j] = a[i][j]
  96.                     cur_mx_answ = find_max(st1) + find_max(st2) + find_max(st3) + find_max(st4) + find_max(st5)
  97.                     cur_mn_answ = find_min(st1) + find_min(st2) + find_min(st3) + find_min(st4) + find_min(st5)
  98.                     answ_mx = max(answ_mx, cur_mx_answ)
  99.                     answ_mn = min(answ_mn, cur_mn_answ)
  100. print(answ_mn, answ_mx)
Advertisement
Add Comment
Please, Sign In to add comment