Submission #144945


Source Code Expand

#!/usr/bin/env python2.7

import sys
from collections import defaultdict

from cStringIO import StringIO
import unittest
import cProfile

def main():
    R, C, K = (int(x) for x in sys.stdin.readline().split())
    F = []
    for _ in range(R):
        f, = [x for x in sys.stdin.readline().split()]
        F.append(f)
    print solve(R, C, K, F)

def findPos(F, c):
    for y, l in enumerate(F):
        for x, t in enumerate(l):
            if t == c:
                return x, y


def solve(R, C, K, F):
    s = findPos(F, "S")
    c = findPos(F, "C")
    g = findPos(F, "G")

    NOWAY = 1000000
    # [start,goal,k] = N
    def mint():
        return NOWAY
    dp = defaultdict(mint)

    def filldp(F, s, p, t, k):
        ss = [(s, p, t, k)]

        while len(ss) > 0:
            s, p, t, k = ss.pop(0)
            if k > K:
                continue
            f = False
            for kk in range(k, K+1):
                if dp[s,p,kk] > t:
                    dp[s,p,kk] = t
                    f = True
            if not f:
                continue

            px, py = p
            np = []
            if px + 1 < C:
                np.append((px + 1, py))
            if px - 1 >= 0:
                np.append((px - 1, py))
            if py + 1 < R:
                np.append((px, py + 1))
            if py - 1 >= 0:
                np.append((px, py - 1))
    
            for nx, ny in np:
                if F[ny][nx] == 'E':
                    ss.append((s, (nx, ny), t+1, k+1))
                elif F[ny][nx] != 'T':
                    ss.append((s, (nx, ny), t+1, k))

    filldp(F, s, s, 0, 0)
    filldp(F, c, c, 0, 0)
    filldp(F, g, g, 0, 0)
    
    vary = defaultdict(list)
    for y in range(R):
        for x in range(C):
            i = (x, y)
            prev = -1
            for k in range(K+1):
                if dp[s,i,k] != prev:
                    vary[s,i].append(k)
                    prev = dp[s,i,k]
            prev = -1
            for k in range(K+1):
                if dp[c,i,k] != prev:
                    vary[c,i].append(k)
                    prev = dp[c,i,k]

    m = NOWAY
    for y in range(R):
        for x in range(C):
            i = (x, y)
            for k1 in vary[s,i]:
                for k2 in vary[c,i]:
                    k3 = K - k1 - k2
                    if k3 < 0:
                        break
                    t = dp[s,i,k1] + dp[c,i,k2] * 2 + dp[g,i,k3]
                    if m > t:
                        m = t
                    #if m > t:
                    #    print x, y, k1, k2, k3, dp[s,i,k1], dp[c,i,k2], dp[g,i,k3]
    if m == NOWAY:
        return -1
    return m
    
class Test(unittest.TestCase):

    @staticmethod
    def tryone(indata):
        sys.stdin = StringIO(indata)
        out = sys.stdout = StringIO()
        main()
        return out.getvalue()

    def test30(self):
        self.assertEqual(findPos([
            "GET..ET",
            "..T....",
            ".TEST..",
            ".E.T.ET",
            "...ETC.",
        ], "S"), (3,2))

    def test50(self):
        self.assertEqual(solve(5, 7, 3, [
            "GET..ET",
            "..T....",
            ".TEST..",
            ".E.T.ET",
            "...ETC.",
        ]), 19)

    def test80(self):
        solve(50, 50, 100, 
            ["S................................................."] +
            [".................................................."] * 48 +
            ["C................................................G"]
        ),

    def test91(self):
        self.assertEqual(self.tryone("""\
5 7 3
GET..ET
..T....
.TEST..
.E.T.ET
...ETC.
"""), """19\n""")

    def test92(self):
        self.assertEqual(self.tryone("""\
5 7 2
GET..ET
..T....
.TEST..
.E.T.ET
...ETC.
"""), """21\n""")

    def test93(self):
        self.assertEqual(self.tryone("""\
5 7 1
GET..ET
..T....
.TEST..
.E.T.ET
...ETC.
"""), """-1\n""")

    def test94(self):
        self.assertEqual(self.tryone("""\
6 35 4
T...TT.....TT...TTT...TTT..TTG.....
..T..T.TTT.T..T..E..T..E...TTT.TTT.
.TTT.T.....E.TTTTT.TTT.TTT.TTT.....
.....T.TT.TT.TTTTT.TTT.TTT.TTTTTTT.
.TTT.T.TT..T..T..S..T..TTT.TTTTTTT.
.CTT.E.TTT.TT...TTT...TT.....E.....
"""), """94\n""")

if __name__ == '__main__':
    if len(sys.argv) > 1:
        print "_/" * 30 + str(sys.argv)
        if sys.argv[1] == '-p':
            sys.argv.pop(1)
            cProfile.run("unittest.main(exit=False, failfast=True)", sort='time')
        else:
            unittest.main()
    else:
        main()

Submission Info

Submission Time
Task C - 最後の森
User over80
Language Python (2.7.3)
Score 0
Code Size 4717 Byte
Status TLE
Exec Time 2048 ms
Memory 135488 KB

Judge Result

Set Name All
Score / Max Score 0 / 100
Status
AC × 22
TLE × 8
Set Name Test Cases
All case_01.txt, case_02.txt, case_03.txt, case_04.txt, case_05.txt, case_06.txt, case_07.txt, case_08.txt, case_09.txt, case_10.txt, case_11.txt, case_12.txt, case_13.txt, case_14.txt, case_15.txt, case_16.txt, case_17.txt, case_18.txt, case_19.txt, case_20.txt, case_21.txt, case_22.txt, case_23.txt, case_24.txt, case_25.txt, case_26.txt, case_27.txt, case_28.txt, case_29.txt, case_30.txt
Case Name Status Exec Time Memory
case_01.txt AC 89 ms 4380 KB
case_02.txt AC 74 ms 4408 KB
case_03.txt AC 75 ms 4444 KB
case_04.txt AC 109 ms 4492 KB
case_05.txt AC 82 ms 4432 KB
case_06.txt AC 80 ms 4456 KB
case_07.txt AC 93 ms 4968 KB
case_08.txt AC 129 ms 10440 KB
case_09.txt AC 101 ms 6124 KB
case_10.txt AC 111 ms 6268 KB
case_11.txt AC 112 ms 6520 KB
case_12.txt AC 82 ms 4824 KB
case_13.txt AC 310 ms 13924 KB
case_14.txt TLE 2038 ms 42144 KB
case_15.txt TLE 2042 ms 71140 KB
case_16.txt AC 533 ms 23288 KB
case_17.txt TLE 2048 ms 82964 KB
case_18.txt AC 126 ms 7508 KB
case_19.txt TLE 2036 ms 24976 KB
case_20.txt TLE 2047 ms 135488 KB
case_21.txt TLE 2041 ms 72156 KB
case_22.txt AC 244 ms 13848 KB
case_23.txt TLE 2040 ms 66268 KB
case_24.txt AC 837 ms 25212 KB
case_25.txt TLE 2038 ms 42664 KB
case_26.txt AC 423 ms 23052 KB
case_27.txt AC 1188 ms 71388 KB
case_28.txt AC 1583 ms 75180 KB
case_29.txt AC 148 ms 7416 KB
case_30.txt AC 388 ms 12828 KB
sample_01.txt AC 76 ms 4448 KB
sample_02.txt AC 77 ms 4416 KB
sample_03.txt AC 73 ms 4368 KB
sample_04.txt AC 80 ms 4872 KB