Advertisement
ossifrage

The Knight and the Maze

Jul 26th, 2016
653
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.80 KB | None | 0 0
  1. # http://puzzling.stackexchange.com/q/38324/40
  2.  
  3. def knight():
  4.     m = ["111111111110110100001000010000000001000100",
  5.          "000000000000010101000001000000000100010001",
  6.          "011111111111100001000100011001010010100010",
  7.          "000000000000000010000000000101010000000010",
  8.          "011010101001100010011001000100000010101000",
  9.          "000000000000100001100100000100011000000000",
  10.          "111011011101100000000001100101001001000111",
  11.          "000000000000000100000000111001001001000100",
  12.          "111111111110100000101100000000000100010110",
  13.          "000000000000000010100001000000000100010010",
  14.          "110110111111100010100100010101000000000000",
  15.          "100000000000111100010100010101010110011100",
  16.          "110111111110100100010001000000110001110101"]
  17.     a = []
  18.     w = len(m[0])
  19.     h = len(m)
  20.     MAX = w*h+1
  21.     for i in range(h):
  22.         a.append([])
  23.         for j in range(w):
  24.             a[i].append([-1,MAX][int(m[i][j])])
  25.     a[0][0] = 0
  26.     q = [(0,0)]
  27.     while len(q) > 0:
  28.         (x,y),q = q[0],q[1:]
  29.         for dx in [-2,-1,1,2]:
  30.             for dy in [-2,-1,1,2]:
  31.                 if abs(dx*dy) != 2:
  32.                     continue
  33.                 xx, yy = x+dx, y+dy
  34.                 if (xx>=0 and xx<w and yy>=0 and yy<h and
  35.                       a[yy][xx] != -1 and a[yy][xx]>a[y][x]+1):
  36.                     a[yy][xx] = a[y][x]+1
  37.                     q.append((xx,yy))
  38.     for i in range(h):
  39.         o = ""
  40.         for j in range(w):
  41.             c = a[i][j]
  42.             if c == -1:
  43.                 o = o + "."  # blue cell (off-limits)
  44.             elif c == MAX:
  45.                 o = o + "-"  # yellow, but still unreachable
  46.             else:
  47.                 if c > 25:
  48.                     c += 6
  49.                 o = o + chr(c+65)
  50.         print o
  51.  
  52. knight()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement