def searchloop_sub(mp, y0, x0):
ly, lx, ny, nx = y0, x0, y0+d[mp[y0][x0]][0], x0+d[mp[y0][x0]][1]
root = [[ly, lx], [ny, nx]]
while True:
if ny<0 or ny>=H or nx<0 or nx>=W:
return False
ty, tx, ny, nx = ny, nx, ny+d[mp[ny][nx]][0], nx+d[mp[ny][nx]][1]
if ny==ly and nx==lx:
return False
if [ny, nx] in root:
root.append([ny, nx])
for p in reversed(root):
if mp[p[0]][p[1]]=="#":
break
mp[p[0]][p[1]] = '#'
return True
root.append([ny, nx])
ly, lx = ty, tx
def searchloop(mpd):
mp = []
for mpdi in mpd:
mp.append(list(mpdi))
for y in range(H):
for x in range(W):
ret = searchloop_sub(mp, y, x)
if ret:
break
if ret:
break
for ty in range(H):
print("".join(mp[ty]))
print()
d = {"N":[-1, 0], "E":[0, 1], "S":[1, 0], "W":[0, -1]}
H, W = 4, 5
searchloop(["SWNSW","EWSNN","WSNNE","EEWWS"])
searchloop(["EESWW","NWSEE","NWWSS","WENNW"])
searchloop(["EWESN","SWESW","ENNWS","WSEES"])
ZGVmIHNlYXJjaGxvb3Bfc3ViKG1wLCB5MCwgeDApOgogIGx5LCBseCwgbnksIG54ID0geTAsIHgwLCB5MCtkW21wW3kwXVt4MF1dWzBdLCB4MCtkW21wW3kwXVt4MF1dWzFdCiAgcm9vdCA9IFtbbHksIGx4XSwgW255LCBueF1dCiAgd2hpbGUgVHJ1ZToKICAgIGlmIG55PDAgb3Igbnk+PUggb3Igbng8MCBvciBueD49VzoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB0eSwgdHgsIG55LCBueCA9IG55LCBueCwgbnkrZFttcFtueV1bbnhdXVswXSwgbngrZFttcFtueV1bbnhdXVsxXQogICAgaWYgbnk9PWx5IGFuZCBueD09bHg6CiAgICAgIHJldHVybiBGYWxzZQogICAgaWYgW255LCBueF0gaW4gcm9vdDoKICAgICAgcm9vdC5hcHBlbmQoW255LCBueF0pCiAgICAgIGZvciBwIGluIHJldmVyc2VkKHJvb3QpOgogICAgICAgIGlmIG1wW3BbMF1dW3BbMV1dPT0iIyI6CiAgICAgICAgICBicmVhawogICAgICAgIG1wW3BbMF1dW3BbMV1dID0gJyMnCiAgICAgIHJldHVybiBUcnVlCiAgICByb290LmFwcGVuZChbbnksIG54XSkKICAgIGx5LCBseCA9IHR5LCB0eAoKZGVmIHNlYXJjaGxvb3AobXBkKToKICBtcCA9IFtdCiAgZm9yIG1wZGkgaW4gbXBkOgogICAgbXAuYXBwZW5kKGxpc3QobXBkaSkpCiAgZm9yIHkgaW4gcmFuZ2UoSCk6CiAgICBmb3IgeCBpbiByYW5nZShXKToKICAgICAgcmV0ID0gc2VhcmNobG9vcF9zdWIobXAsIHksIHgpCiAgICAgIGlmIHJldDoKICAgICAgICBicmVhawogICAgaWYgcmV0OgogICAgICBicmVhawogIGZvciB0eSBpbiByYW5nZShIKToKICAgIHByaW50KCIiLmpvaW4obXBbdHldKSkKICBwcmludCgpCgpkID0geyJOIjpbLTEsIDBdLCAiRSI6WzAsIDFdLCAiUyI6WzEsIDBdLCAiVyI6WzAsIC0xXX0KSCwgVyA9IDQsIDUKc2VhcmNobG9vcChbIlNXTlNXIiwiRVdTTk4iLCJXU05ORSIsIkVFV1dTIl0pCnNlYXJjaGxvb3AoWyJFRVNXVyIsIk5XU0VFIiwiTldXU1MiLCJXRU5OVyJdKQpzZWFyY2hsb29wKFsiRVdFU04iLCJTV0VTVyIsIkVOTldTIiwiV1NFRVMiXSkK