您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

37 行
996B

  1. def move(pt):
  2. x, y, z = pt
  3. for dx in [1, 0, -1]:
  4. for dy in [1, 0, -1]:
  5. for dz in [1, 0, -1]:
  6. if abs(dx) + abs(dy) + abs(dz) == 1:
  7. yield x + dx, y + dy, z + dz
  8. def is_outside(pt, outside=set(), inside=set(), max_bubble_size=2000):
  9. edge = {pt}
  10. seen = set()
  11. while True:
  12. edge = {adj_pt for pt in edge for adj_pt in move(pt)} - seen - cubes
  13. seen |= edge
  14. if seen & outside or len(seen) > max_bubble_size:
  15. outside |= seen
  16. return True
  17. if seen & inside or not edge:
  18. inside |= seen
  19. return False
  20. def solve(is_outside=lambda *args: True):
  21. surface = 0
  22. for pt in cubes:
  23. for adj_pt in move(pt):
  24. if adj_pt not in cubes and is_outside(adj_pt):
  25. surface += 1
  26. return surface
  27. text = open(0).read()
  28. cubes = {tuple(map(int, ln.split(','))) for ln in text.splitlines()}
  29. print(solve())
  30. print(solve(is_outside))