[2015-10-30] Challenge #238 [Hard] Searching a Dungeon

Here is my Python 3.x code. Comments welcome:

import numpy as np
from itertools import chain, product


def navigate(flrsmap):
    npmap = np.array([[list(row) for row in flr.split('\n')]
                      for flr in flrsmap.split('\n\n')])

    def navrecur(poses):
        curpos = poses[-1]
        endposes = None
        moves = product([1, 2], [-1, 1])
        if npmap[curpos] == 'U':
            moves = chain(moves, [(0, -1)])
        elif npmap[curpos] == 'D':
            moves = chain(moves, [(0, 1)])
        for axis, step in moves:
            newpos = list(curpos)
            newpos[axis] += step
            newpos = tuple(newpos)

            if newpos in poses:
                continue
            if npmap[newpos] == '#':
                continue
            if npmap[newpos] == 'G':
                return poses

            resposes = navrecur(poses+[newpos])
            if resposes is None:
                continue
            if endposes and len(resposes) > len(endposes):
                continue
            endposes = resposes
        return endposes

    curpos = tuple(x[0] for x in (npmap == 'S').nonzero())
    poses = navrecur([curpos])
    for pos in poses:
        if npmap[pos][0] not in 'SUDG':
            npmap[pos] = '*'

    return '\n\n'.join('\n'.join(''.join(row) for row in flr) 
                       for flr in npmap)

flrsmap = """##########
#S###    #
#   # ####
### # #D##
#   # # ##
#D# # # ##
###     ##
### ### ##
###     ##
##########

##########
#   #   D#
#     ####
###   # ##
#U#   # ##
# #    D##
##########
#       ##
#D# # # ##
##########

##########
#        #
# ########
# #U     #
# #      #
# ####   #
#    #####
#### ##U##
# D#    ##
##########

##########
#        #
# ###### #
# #    # #
# # ## # #
# #  #   #
# ## # # #
# ##   # #
#  #####G#
##########"""

print(navigate(flrsmap))

And my results:

##########
#S###    #
#***# ####
###*# #D##
#  *# #*##
#D#*# #*##
###*****##
### ### ##
###     ##
##########

##########
#   #***D#
#    *####
###  *#*##
#U#  *#*##
# #  **D##
##########
#*******##
#D# # # ##
##########

##########
#********#
#*########
#*#U     #
#*#      #
#*####   #
#****#####
####*##U##
#*D#****##
##########

##########
#********#
#*######*#
#*#    #*#
#*# ## #*#
#*#  #  *#
#*## # #*#
#*##   #*#
#**#####G#
##########
/r/dailyprogrammer Thread