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 |
|
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 |