Submission #668527
Source Code Expand
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import itertools
import numpy
import sys
DS = [(1, 0), (-1, 0), (0, 1), (0, -1)]
H = 30
W = 30
TRIAL = 20
INF = 100000
class Solver(object):
def __init__(self, stage, deltas=DS):
self.stage = None
self.original_stage = stage.copy()
self.hands = None
self.naive_counter = 0
self.deltas = deltas[:]
self.indices = numpy.array(list(itertools.product(range(H), range(W))))
self.initialize()
def initialize(self):
self.stage = self.original_stage.copy()
self.hands = []
self.naive_counter = 0
def decrement(self, r, c):
self.hands.append((r + 1, c + 1))
self.stage[r, c] -= 1
def shuffle_indices(self):
numpy.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.naive_counter += 1
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.initialize()
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)
min_naive_counter = INF
optimal_hands = None
for _ in range(TRIAL):
solver.use_multiple_adj_solution()
new_naive_counter = solver.naive_counter
if new_naive_counter < min_naive_counter:
min_naive_counter = new_naive_counter
optimal_hands = solver.hands
for r, c in optimal_hands:
print("{} {}".format(r, c))
if __name__ == '__main__':
main()
Submission Info
Submission Time |
|
Task |
A - 高橋君の山崩しゲーム |
User |
hamukichi |
Language |
Python (3.4.3) |
Score |
541425 |
Code Size |
2397 Byte |
Status |
AC |
Exec Time |
4771 ms |
Memory |
28556 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 |
55577 / 100000 |
53250 / 100000 |
54841 / 100000 |
51905 / 100000 |
54813 / 100000 |
54602 / 100000 |
53729 / 100000 |
55336 / 100000 |
53828 / 100000 |
53544 / 100000 |
Status |
|
|
|
|
|
|
|
|
|
|
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 |
4771 ms |
28556 KB |
subtask_01_02.txt |
AC |
4421 ms |
19580 KB |
subtask_01_03.txt |
AC |
4591 ms |
19176 KB |
subtask_01_04.txt |
AC |
4354 ms |
19824 KB |
subtask_01_05.txt |
AC |
4578 ms |
19264 KB |
subtask_01_06.txt |
AC |
4382 ms |
19348 KB |
subtask_01_07.txt |
AC |
4486 ms |
19356 KB |
subtask_01_08.txt |
AC |
4329 ms |
19396 KB |
subtask_01_09.txt |
AC |
4376 ms |
19604 KB |
subtask_01_10.txt |
AC |
4501 ms |
19456 KB |