人材獲得作戦・4を解答してみた
物議を醸している下記の問題
人生を書き換える者すらいた。: 人材獲得作戦・4 試験問題ほか
なかなかの良問だと思ったのでPythonで解答してみた.かかった時間は1時間ぐらい.
#!/usr/bin/env python2.6 from __future__ import print_function import sys def printmaze(maze): for line in maze: print(''.join(line)) def neighbours(x,y): return ((x-1,y),(x+1,y),(x,y-1),(x,y+1)) def find(c, maze): for i,line in enumerate(maze): try: j = line.index(c) return i,j except ValueError: pass def trace(maze, goal, length): node = goal while length > 1: for x,y in neighbours(*node): if maze[x][y] == length-1: node = (x, y) maze[x][y] = '$' break length -= 1 for i in range(len(maze)): for j in range(len(maze[0])): if type(maze[i][j]) is int: maze[i][j] = ' ' printmaze(maze) def main(): maze = [list(line.strip('\n')) for line in sys.stdin] nodes = [find('S', maze)] length = 1 while nodes: new_nodes = [] for node in nodes: new_neighbours = neighbours(*node) for new_neighbour in new_neighbours: x,y = new_neighbour if maze[x][y] == ' ': maze[x][y] = length new_nodes.append((x,y)) elif maze[x][y] == 'G': trace(maze, (x,y), length+1) exit() length += 1 nodes = new_nodes if __name__ == '__main__': main()
綺麗に書けたつもりではいるが,まだ自分には時間をかけて深く考えすぎてしまう癖があるようだ.