fork download
  1. E=enumerate
  2. M=[(1,0),(0,1),(-1,0),(0,-1)]
  3. def P(x,y,t,d):
  4. q=[(x,y,[])]
  5. for x,y,s in q:
  6. if(x,y)in t:return s[:-1]
  7. for X,Y in M:q+=((0==d.get(U:=(x+X,y+Y))or U in t)*~-(U in s)*~-any(all((x+X,y+Y)in s+[U]+t for X,Y in[(0,0),(1,1)]+M[:2])for x,y in s+[U]+t))*[(*U,s+[U])]
  8. def f(b):
  9. d={(x,y):v for x,r in E(b)for y,v in E(r)};a,b,*r=[i for i in d if d[i]];p=P(*a,[b],d)
  10. while r:p+=P(*r.pop(),p,d)
  11. return p
  12.  
  13. def to_board(s):
  14. return [[int(j=='k')for j in i]for i in filter(None, s.split('\n'))]
  15.  
  16. def display_solution(s,p):
  17. s=[*map(list,filter(None, s.split('\n')))]
  18. for x, y in p:s[x][y]= '#'
  19. print('\n'.join(''.join(i) for i in s))
  20.  
  21. s1 = """
  22. .........
  23. ....k....
  24. .........
  25. .........
  26. .k.......
  27. .........
  28. .....k...
  29. .........
  30. .........
  31. """
  32. s2 = """
  33. k.k......
  34. .........
  35. k........
  36. .........
  37. .........
  38. .........
  39. .........
  40. .........
  41. .........
  42. """
  43. s3 = """
  44. .k.......
  45. k........
  46. .k.......
  47. .........
  48. .........
  49. .........
  50. .........
  51. .........
  52. .........
  53. """
  54. s4 ="""
  55. .........
  56. .........
  57. k........
  58. .........
  59. k........
  60. .........
  61. k........
  62. .........
  63. .........
  64. """
  65. s5 = """
  66. ........k
  67. ....k....
  68. .........
  69. .........
  70. .........
  71. .........
  72. .........
  73. ....k....
  74. .........
  75. """
  76. s6 = """
  77. .........
  78. .........
  79. .........
  80. .........
  81. .........
  82. .........
  83. k........
  84. .k.......
  85. ..k......
  86. """
  87. display_solution(s1, f(to_board(s1)))
  88. print('-'*40)
  89. display_solution(s2, f(to_board(s2)))
  90. print('-'*40)
  91. display_solution(s3, f(to_board(s3)))
  92. print('-'*40)
  93. display_solution(s4, f(to_board(s4)))
  94. print('-'*40)
  95. display_solution(s5, f(to_board(s5)))
  96. print('-'*40)
  97. display_solution(s6, f(to_board(s6)))
Success #stdin #stdout 0.15s 14060KB
stdin
Standard input is empty
stdout
.........
....k....
....#....
....#....
.k####...
.....#...
.....k...
.........
.........
----------------------------------------
k#k......
.#.......
k#.......
.........
.........
.........
.........
.........
.........
----------------------------------------
.k.......
k#.......
.k.......
.........
.........
.........
.........
.........
.........
----------------------------------------
.........
.........
k........
##.......
k#.......
.#.......
k#.......
.........
.........
----------------------------------------
........k
....k####
.....#...
.....#...
.....#...
.....#...
.....#...
....k#...
.........
----------------------------------------
.........
.........
.........
.........
.........
.........
k........
#k.......
##k......