fork download
  1. #0J/QsNGA0YXQvtC80LXQvdC60L4g
  2. #%%
  3. from collections import deque
  4.  
  5. def rook_distance(a, b):
  6. (x1, y1) = a
  7. (x2, y2) = b
  8. if a == b:
  9. return 0
  10. if x1 == x2 or y1 == y2:
  11. return 1
  12. return 2
  13.  
  14.  
  15. def min_moves(m, rook_pos, black_pieces):
  16.  
  17. n = len(black_pieces)
  18. dist = [[0] * n for _ in range(n)]
  19. rook_to_piece = [0] * n
  20.  
  21. for i in range(n):
  22. rook_to_piece[i] = rook_distance(rook_pos, black_pieces[i])
  23.  
  24. for i in range(n):
  25. for j in range(n):
  26. dist[i][j] = rook_distance(black_pieces[i], black_pieces[j])
  27.  
  28. INF = 10**9
  29. dp = [[INF] * n for _ in range(1 << n)]
  30.  
  31. queue = deque()
  32.  
  33.  
  34. for i in range(n):
  35. mask = 1 << i
  36. dp[mask][i] = rook_to_piece[i]
  37. queue.append((mask, i))
  38.  
  39.  
  40. while queue:
  41. mask, last = queue.popleft()
  42. current_cost = dp[mask][last]
  43.  
  44. for nxt in range(n):
  45. if mask & (1 << nxt):
  46. continue
  47. new_mask = mask | (1 << nxt)
  48. new_cost = current_cost + dist[last][nxt]
  49.  
  50. if new_cost < dp[new_mask][nxt]:
  51. dp[new_mask][nxt] = new_cost
  52. queue.append((new_mask, nxt))
  53.  
  54. full_mask = (1 << n) - 1
  55. return min(dp[full_mask]) if n > 0 else 0
  56. if __name__ == "__main__":
  57. m = 20
  58. rook_pos = (1, 1)
  59. black_pieces = [(13, 5), (3, 7), (6, 17), (7, 20)]
  60.  
  61. print("Мінімальна кількість ходів:", min_moves(m, rook_pos, black_pieces))
  62.  
Success #stdin #stdout 0.12s 14072KB
stdin
Standard input is empty
stdout
Мінімальна кількість ходів: 8