fork download
  1. def f(b):
  2. Q,W=len(b),len(b[0]);q,d=[(0,0,[(0,0)],0)],{}
  3. for x,y,p,c in q:
  4. if Q-x==1==W-y:d[c]=p;continue
  5. Z=lambda x:x in d and len(p)>=len(d[x])
  6. for T in[(x+1,y),(x,y+1),(x-1,y),(x,y-1)]:
  7. if(Q>T[0]>-1<T[1]<W)>(T in p)and((F:='#'!=b[T[0]][T[1]])>Z(c)or d=={}or(c<max(d))>Z(c+1)):q+=(*T,p+[T],c+1-F),
  8. return d
  9.  
  10. s1 = """
  11. ..#..#..
  12. """
  13. s2 = """
  14. .#...
  15. ...#.
  16. """
  17. s3 = """
  18. ....
  19. ....
  20. ....
  21. ....
  22. """
  23. s4 = """
  24. ..#..
  25. ..#..
  26. ..#..
  27. """
  28.  
  29. s5 = """
  30. .#.#.
  31. ##.##
  32. .###.
  33. """
  34.  
  35. s6 = """
  36. .......
  37. ######.
  38. .......
  39. .######
  40. ....#..
  41. """
  42.  
  43. s7 = """
  44. .....#..
  45. #######.
  46. #######.
  47. ........
  48. .#######
  49. .#######
  50. ....#...
  51. """
  52. def to_board(s):
  53. return [[*i]for i in filter(None, s.split('\n'))]
  54.  
  55. def render_board(d,s):
  56. b = to_board(s)
  57. for x,y in d[min(d)]:b[x][y]='+'
  58. return'\n'.join(''.join(i) for i in b)
  59.  
  60. print(render_board(f(to_board(s1)), s1))
  61. print()
  62. print(render_board(f(to_board(s2)), s2))
  63. print()
  64. print(render_board(f(to_board(s3)), s3))
  65. print()
  66. print(render_board(f(to_board(s4)), s4))
  67. print()
  68. print(render_board(f(to_board(s5)), s5))
  69. print()
  70. print(render_board(f(to_board(s6)), s6))
  71. print()
  72. print(render_board(f(to_board(s7)), s7))
  73.  
Success #stdin #stdout 0.93s 51020KB
stdin
Standard input is empty
stdout
++++++++

+#+++
+++#+

++++
...+
...+
...+

+++++
..#.+
..#.+

+++++
##.#+
.###+

+++++++
######+
......+
.#####+
....#.+

++++++++
#######+
#######+
++++++++
+#######
+#######
++++++++