Submission #667813


Source Code Expand

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import itertools
import numpy
import random
import sys

DS = [(1, 0), (-1, 0), (0, 1), (0, -1)]
H = 30
W = 30


class Solver(object):

    def __init__(self, stage, deltas=DS):
        self.stage = stage
        self.hands = None
        self.deltas = deltas[:]
        self.indices = numpy.array(list(itertools.product(range(H), range(W))))
        self.init_hands()

    def init_hands(self):
        self.hands = []

    def decrement(self, r, c):
        self.hands.append((r + 1, c + 1))
        self.stage[r, c] -= 1

    def shuffle_indices(self):
        random.shuffle(self.indices)

    def naive_solution(self):
        for r, c in itertools.product(range(H), range(W)):
            cell = self.stage[r, c]
            if cell <= 0:
                continue
            for _ in range(cell):
                self.decrement(r, c)

    def search_adj(self, r0, c0):
        for dr, dc in self.deltas:
            (r, c) = (r0 + dr, c0 + dc)
            if r < 0 or r >= H or c < 0 or c >= W:
                continue
            elif 0 < self.stage[r, c] == self.stage[r0, c0]:
                self.decrement(r, c)
                self.search_adj(r, c)
                break

    def use_multiple_adj_solution(self):
        self.shuffle_indices()
        for r0, c0 in self.indices:
            if self.stage[r0, c0] <= 0:
                continue
            self.decrement(r0, c0)
            self.search_adj(r0, c0)
        self.naive_solution()


def main():
    sys.setrecursionlimit(10000)
    stage = numpy.array([list(map(int, input().split())) for _ in range(H)])
    solver = Solver(stage)
    solver.use_multiple_adj_solution()
    for r, c in solver.hands:
        print("{} {}".format(r, c))
    # print(solver.stage)


if __name__ == '__main__':
    main()

Submission Info

Submission Time
Task A - 高橋君の山崩しゲーム
User hamukichi
Language Python (3.4.3)
Score 541437
Code Size 1901 Byte
Status AC
Exec Time 2866 ms
Memory 27772 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 55571 / 100000 53253 / 100000 54845 / 100000 51909 / 100000 54813 / 100000 54609 / 100000 53727 / 100000 55339 / 100000 53814 / 100000 53557 / 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 2866 ms 27772 KB
subtask_01_02.txt AC 498 ms 16844 KB
subtask_01_03.txt AC 480 ms 16712 KB
subtask_01_04.txt AC 513 ms 17100 KB
subtask_01_05.txt AC 487 ms 16584 KB
subtask_01_06.txt AC 494 ms 16648 KB
subtask_01_07.txt AC 490 ms 16728 KB
subtask_01_08.txt AC 470 ms 16844 KB
subtask_01_09.txt AC 487 ms 16760 KB
subtask_01_10.txt AC 487 ms 17100 KB