Submission #2064049


Source Code Expand

DEBUG_MODE = 0


def exit():
    import sys
    sys.exit()


class Solver():
    def __init__(self, cells):
        self.cells = cells
        self.directions = [(0, -1), (-1, 0), (0, 1), (1, 0)]
        self.w = 30
        self.h = 30
        self.final_ans = []

    def run(self):
        p = self.search_top()
        while p is not None:
            while True:
                x = p[0]
                y = p[1]
                self.final_ans.append([y, x])
                self.cells[y][x] = self.cells[y][x] - 1
                # print("{} {}".format(y+1, x+1))

                next_p = None
                for d in self.directions:
                    nx = x + d[0]
                    ny = y + d[1]
                    if not self.check_border(nx, ny):
                        continue
                    if self.cells[y][x] == self.cells[ny][nx] and self.cells[ny][nx] > 0:
                        next_p = (nx, ny)
                        break
                if next_p is not None:
                    p = next_p
                    continue
                break

            # 更新
            p = self.search_top()

    def compare_around(self, x, y):
        """
        (x, y)の上下左右を探索し、周囲より値が高ければTrue
        """
        for d in self.directions:
            dx = x + d[0]
            dy = y + d[1]
            if not self.check_border(dx, dy):
                continue
            if self.cells[y][x] < self.cells[dy][dx]:
                return False
        return True

    def search_top(self):
        """
        探索して、山のてっぺんを見つけたらその座標を返す。それ以外はNone
        """
        for y in range(0, self.h):
            for x in range(0, self.w):
                if (self.cells[y][x] <= 0):
                    continue
                if self.compare_around(x, y):
                    return (x, y)
        return None

    def check_border(self, x, y):
        if x < 0 or x > self.w - 1:
            return False
        elif y < 0 or y > self.h - 1:
            return False
        else:
            return True


def print4cells(cells):
    print("====" * 5)
    for row in cells:
        for r in row:
            print("{0:3d}".format(r), end=" ")
        print("")


def main():
    lines = []
    if not DEBUG_MODE:
        for i in range(0, 30):
            x = input()
            lines.append(x)
    else:
        with open("test1.txt", "r") as f:
            lines = [i.rstrip("\n") for i in f.readlines()]

    # convert int cells
    cells = []
    for y in lines:
        tmp = []
        for x in y.split(" "):
            tmp.append(int(x))
        cells.append(tmp)

    if DEBUG_MODE:
        print4cells(cells)

    # Let's go!
    solver = Solver(cells)
    solver.run()

    final_ans = solver.final_ans

    if DEBUG_MODE:
        cells = solver.cells
        print4cells(cells)
        with open("debug.txt", "w") as f:
            for ans in final_ans:
                line = " ".join(str(i+1) for i in ans)
                f.write(line + "\n")
    else:
        for ans in final_ans:
            line = " ".join(str(i+1) for i in ans)
            print(line)


if __name__ == "__main__":
    main()

Submission Info

Submission Time
Task A - 高橋君の山崩しゲーム
User ksakiyama134
Language Python (3.4.3)
Score 867504
Code Size 3371 Byte
Status AC
Exec Time 8472 ms
Memory 8536 KB

Judge Result

Set Name test_01 test_02 test_03 test_04 test_05 test_06 test_07 test_08 test_09 test_10
Score / Max Score 86889 / 100000 86834 / 100000 86791 / 100000 86347 / 100000 86218 / 100000 86434 / 100000 87593 / 100000 86482 / 100000 86695 / 100000 87221 / 100000
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
test_01 subtask_01_01.txt
test_02 subtask_01_02.txt
test_03 subtask_01_03.txt
test_04 subtask_01_04.txt
test_05 subtask_01_05.txt
test_06 subtask_01_06.txt
test_07 subtask_01_07.txt
test_08 subtask_01_08.txt
test_09 subtask_01_09.txt
test_10 subtask_01_10.txt
Case Name Status Exec Time Memory
subtask_01_01.txt AC 6720 ms 8152 KB
subtask_01_02.txt AC 7591 ms 8460 KB
subtask_01_03.txt AC 7745 ms 8256 KB
subtask_01_04.txt AC 8472 ms 8536 KB
subtask_01_05.txt AC 7390 ms 8272 KB
subtask_01_06.txt AC 7952 ms 8244 KB
subtask_01_07.txt AC 7309 ms 8392 KB
subtask_01_08.txt AC 7005 ms 8256 KB
subtask_01_09.txt AC 7445 ms 8368 KB
subtask_01_10.txt AC 7585 ms 8396 KB