| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- import math
- import sys
- w, h = [int(i) for i in input().split()]
- # grid = [(x, y) for x in range(0, w) for y in range(0, h)]
- grid = [[1 for _ in range(w)] for _ in range(h)]
- NULL_ROW = [0 for _ in range(w)]
- n = int(input()) # maximum number of turns before game over.
- x0, y0 = [int(i) for i in input().split()]
- # handle special case
- if w + h <= 2:
- input()
- print("0 0")
- DETECT = {"COLDER":-1, "WARMER": 1, "SAME": 0}
- def distance(xa, ya, xb, yb):
- return math.hypot((xb - xa), (ya - yb))
- def _centroid(data):
- xs, ys = zip(*data)
- return int(sum(xs) / len(xs)), int(sum(ys) / len(xs))
- def centroid(table):
- yc = int(sum([y * sum(row) for y, row in enumerate(table)]) / sum(sum(table, [])))
- xc = int(sum([x * v for x, v in enumerate(table[yc])]) / sum(table[yc]))
- return xc, yc
- def search2d(grid, _send, _get):
- # dichotomy on 3d list
- icur, jcur = x0, y0
- input()
- while 1:
- inew, jnew = centroid(grid)
- while not grid[jnew][inew]:
- inew = (inew + 1) % w
- jnew = (jnew + 1) % h
- # print("send new ", inew, jnew, file=sys.stderr)
- _send(inew, jnew)
- ddist = _get()
- # print("ddist= ", ddist, file=sys.stderr)
- if ddist > 0:
- grid = [[int(v == 1 and distance(i, j, inew, jnew) < distance(i, j, icur, jcur)) \
- for i, v in enumerate(row)] for j, row in enumerate(grid)]
- elif ddist < 0:
- grid = [[int(v == 1 and distance(i, j, inew, jnew) > distance(i, j, icur, jcur)) \
- for i, v in enumerate(row)] for j, row in enumerate(grid)]
- else:
- grid = [[int(v == 1 and distance(i, j, inew, jnew) == distance(i, j, icur, jcur)) \
- for i, v in enumerate(row)] for j, row in enumerate(grid)]
- # print("grid : ", grid, file=sys.stderr)
- if len(grid) == 1:
- return grid.pop()
- # remove the current cell
- grid[jcur][icur] = 0
- icur, jcur = inew, jnew
- def old_search2d(grid, _send, _get):
- # dichotomy on 3d list
- x, y = x0, y0
- xnew, ynew = x, y
- input()
- if len(grid) == 1:
- return 0, 0
- while 1:
- imid = int(len(grid) / 2)
- # print("middle of ", grid, file=sys.stderr)
- while (xnew, ynew) == (x, y):
- try:
- xnew, ynew = grid[imid]
- imid = (imid + 1) % len(grid)
- except IndexError:
- pass
- # print("send new ", xnew, ynew, file=sys.stderr)
- _send(xnew, ynew)
- ddist = _get()
- # print("ddist= ", ddist, file=sys.stderr)
- if ddist > 0:
- grid = [(xc, yc) for xc, yc in grid if distance(xc, yc, xnew, ynew) < distance(xc, yc, x, y)]
- elif ddist < 0:
- grid = [(xc, yc) for xc, yc in grid if distance(xc, yc, xnew, ynew) > distance(xc, yc, x, y)]
- else:
- grid = [(xc, yc) for xc, yc in grid if distance(xc, yc, xnew, ynew) == distance(xc, yc, x, y)]
- # print("grid : ", grid, file=sys.stderr)
- if len(grid) == 1:
- return grid.pop()
- x, y = xnew, ynew
- def get_data():
- return DETECT[input()]
- def send_data(x, y):
- print("{} {}".format(x, y))
- x, y = search2d(grid, send_data, get_data)
|