```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 ``` ```#!/usr/bin/python3   ''' SI 335 Spring 2013    Project 3    YOUR NAME HERE '''   import re import random import sys   def calcMoves(maze):     '''This function takes in a 2D-array that stores a maze description,       and returns a list of "moves" to make in order to solve the maze.    '''     # THIS IS THE FUNCTION YOU NEED TO RE-WRITE     # Width and height calculated from maze size, minus borders     w = len(maze) - 2     h = len(maze[0]) - 2     startPos = (1, 0)     endPos = (h, w+1)     curY, curX = startPos       # The solution here is terrible: it just randomly mills about until     # it happens upon the end or it runs out of points.     moves = []     while len(moves) < 4*h*w:         nextY, nextX = curY, curX         # randomly choose a direction         if random.randrange(0,2) == 0:             # go left/right             if random.randrange(0,2) == 0:                 nextX -= 1                 nextMove = 'L'             else:                 nextX += 1                 nextMove = 'R'         else:             # go up/down             if random.randrange(0,2) == 0:                 nextY -= 1                 nextMove = 'U'             else:                 nextY += 1                 nextMove = 'D'         if nextX < 0 or nextX > w+1 or maze[nextY][nextX] == 'X':             # illegal move; give up and try another.             continue         moves.append(nextMove)         curY, curX = nextY, nextX       return moves     def readMaze(stream):     '''This functions reads in a maze description from the given file       and returns a 2-dimensional array of characters.       ' ' means a space in the maze,       'X' means an impenetrable wall, and       'O' means a lucrative prize.    '''     # YOU DON'T NEED TO CHANGE THIS FUNCTION.     notAllowed = re.compile('[^XO ]')     width = 0     maze = []     prizes = set()     rowind = 0     for line in stream:         line = line.rstrip()         s = notAllowed.search(line)         if s:             raise ValueError('Illegal character in maze: {}'.format(s.group(0)))         row = list(line)         wdiff = width - len(row)         if wdiff > 0:             row.extend([' '] * wdiff)         elif wdiff < 0:             for otherRow in maze:                 otherRow.extend([' '] * (-wdiff))             width = len(row)         maze.append(row)         rowind += 1     assert len(maze) >= 2     return tuple(tuple(row) for row in maze)   def writeMoves(moves):     '''Writes the list of moves to standard out'''     # YOU DON'T NEED TO CHANGE THIS FUNCTION     for move in moves:         print(move)   if __name__ == '__main__':     # THIS IS THE MAIN METHOD. YOU DON'T NEED TO CHANGE IT.     maze = readMaze(sys.stdin)     moves = calcMoves(maze)     writeMoves(moves)```