人材獲得作戦・4

TLで見かけた問題を解いてみた。
http://okajima.air-nifty.com/b/2010/01/post-abc6.html
ん・・・これだとLv.3になるのかな?いや大丈夫だよね。

file_name = "maze.txt"
f = open(file_name, 'r')
maze = []
start = None
goal = None
x = 0
y = 0
for line in f.readlines():
    d = []
    x = 0
    for c in line:
        d.append(c)
        if (c == 'S'):
            start = (x, y)
        elif (c == 'G'):
            goal = (x, y)
        x += 1
    maze.append(d)
    y += 1

x_size = len(maze[0])
y_size = len(maze)
visited = []
for i in range(y_size):
    d = []
    for j in range(x_size):
        d.append({'v':False, 's':-1})
    visited.append(d)
        
queue = []
queue.append((start[0], start[1], 0))

while queue:
    x, y, s = queue.pop(0)
    visited[y][x]['v'] = True
    visited[y][x]['s'] = s
    s += 1
    
    for x2, y2 in [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]:
        if not (x2 < 0 or x2 >= x_size or y2 < 0 or y2 >= y_size):
            if (maze[y2][x2] == '*'):
                continue

            if not visited[y2][x2]['v'] or visited[y2][x2]['s'] > s:
                queue.append((x2, y2, s))

x = goal[0]
y = goal[1]
s = visited[y][x]['s']

while 1:
    if (x, y) == start:
        break
    
    for x2, y2 in [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]:
        if not (x2 < 0 or x2 >= x_size or y2 < 0 or y2 >= y_size):
            if (maze[y2][x2] == '*'):
                continue

            if visited[y2][x2]['s'] == s - 1:
                maze[y2][x2] = '$'
                s -= 1
                x = x2
                y = y2
                break

for i in range(y_size):
    print ''.join(maze[i])