2d_dichotomy.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import math
  2. import sys
  3. w, h = [int(i) for i in input().split()]
  4. # grid = [(x, y) for x in range(0, w) for y in range(0, h)]
  5. grid = [[1 for _ in range(w)] for _ in range(h)]
  6. NULL_ROW = [0 for _ in range(w)]
  7. n = int(input()) # maximum number of turns before game over.
  8. x0, y0 = [int(i) for i in input().split()]
  9. # handle special case
  10. if w + h <= 2:
  11. input()
  12. print("0 0")
  13. DETECT = {"COLDER":-1, "WARMER": 1, "SAME": 0}
  14. def distance(xa, ya, xb, yb):
  15. return math.hypot((xb - xa), (ya - yb))
  16. def _centroid(data):
  17. xs, ys = zip(*data)
  18. return int(sum(xs) / len(xs)), int(sum(ys) / len(xs))
  19. def centroid(table):
  20. yc = int(sum([y * sum(row) for y, row in enumerate(table)]) / sum(sum(table, [])))
  21. xc = int(sum([x * v for x, v in enumerate(table[yc])]) / sum(table[yc]))
  22. return xc, yc
  23. def search2d(grid, _send, _get):
  24. # dichotomy on 3d list
  25. icur, jcur = x0, y0
  26. input()
  27. while 1:
  28. inew, jnew = centroid(grid)
  29. while not grid[jnew][inew]:
  30. inew = (inew + 1) % w
  31. jnew = (jnew + 1) % h
  32. # print("send new ", inew, jnew, file=sys.stderr)
  33. _send(inew, jnew)
  34. ddist = _get()
  35. # print("ddist= ", ddist, file=sys.stderr)
  36. if ddist > 0:
  37. grid = [[int(v == 1 and distance(i, j, inew, jnew) < distance(i, j, icur, jcur)) \
  38. for i, v in enumerate(row)] for j, row in enumerate(grid)]
  39. elif ddist < 0:
  40. grid = [[int(v == 1 and distance(i, j, inew, jnew) > distance(i, j, icur, jcur)) \
  41. for i, v in enumerate(row)] for j, row in enumerate(grid)]
  42. else:
  43. grid = [[int(v == 1 and distance(i, j, inew, jnew) == distance(i, j, icur, jcur)) \
  44. for i, v in enumerate(row)] for j, row in enumerate(grid)]
  45. # print("grid : ", grid, file=sys.stderr)
  46. if len(grid) == 1:
  47. return grid.pop()
  48. # remove the current cell
  49. grid[jcur][icur] = 0
  50. icur, jcur = inew, jnew
  51. def old_search2d(grid, _send, _get):
  52. # dichotomy on 3d list
  53. x, y = x0, y0
  54. xnew, ynew = x, y
  55. input()
  56. if len(grid) == 1:
  57. return 0, 0
  58. while 1:
  59. imid = int(len(grid) / 2)
  60. # print("middle of ", grid, file=sys.stderr)
  61. while (xnew, ynew) == (x, y):
  62. try:
  63. xnew, ynew = grid[imid]
  64. imid = (imid + 1) % len(grid)
  65. except IndexError:
  66. pass
  67. # print("send new ", xnew, ynew, file=sys.stderr)
  68. _send(xnew, ynew)
  69. ddist = _get()
  70. # print("ddist= ", ddist, file=sys.stderr)
  71. if ddist > 0:
  72. grid = [(xc, yc) for xc, yc in grid if distance(xc, yc, xnew, ynew) < distance(xc, yc, x, y)]
  73. elif ddist < 0:
  74. grid = [(xc, yc) for xc, yc in grid if distance(xc, yc, xnew, ynew) > distance(xc, yc, x, y)]
  75. else:
  76. grid = [(xc, yc) for xc, yc in grid if distance(xc, yc, xnew, ynew) == distance(xc, yc, x, y)]
  77. # print("grid : ", grid, file=sys.stderr)
  78. if len(grid) == 1:
  79. return grid.pop()
  80. x, y = xnew, ynew
  81. def get_data():
  82. return DETECT[input()]
  83. def send_data(x, y):
  84. print("{} {}".format(x, y))
  85. x, y = search2d(grid, send_data, get_data)