fork download
  1. E=enumerate
  2. G='v^><'
  3. S,P=' O'
  4. O=lambda x,y,D,M=1:[(*t,D[t],m)for(X,Y),m in zip([(1,0),(-1,0),(0,1),(0,-1)],G)if(M==1or[m in G[:2],m in G[2:]][M in G[:2]])and(t:=(x+X,y+Y))in D]
  5. def f(b):
  6. d={(x,y):v for x,j in E(b)for y,v in E(j)};q=[({**d,i:'*'},*i)for i in d if P==d[i]][:1]
  7. while q:
  8. D,x,y=q.pop(0);u,F={},1;Q=[]
  9. for X,Y,v,m in O(x,y,D):
  10. u[v]=(m,(X,Y))
  11. if S==v and{V for J,K,V,_ in O(X,Y,D,m)if(J,K)not in[(X,Y),(x,y)]}&{P,'X',*G}:Q+=({**D,(X,Y):m},X,Y),;F=0
  12. if F:
  13. if(S in D.values())<(P in u):
  14. D={**D,u[P][1]:'%'}
  15. for x,y in D:b[x][y]=D[(x,y)]
  16. return b
  17. elif S in u:Q+=({**D,u[S][1]:u[S][0]},*u[S][1]),
  18. if any(S in[V for *_,V,_ in O(*i,D)]for i in D if P==D[i]):q+=Q
  19.  
  20. s1 = """
  21. XXXXOOOOXXXX
  22. X X
  23. X X
  24. XXXXXXXXXXXX
  25. """
  26. s2 = """
  27. XOOOOOX
  28. X X
  29. X X
  30. X XXXXXXXX
  31. X X
  32. X X
  33. XXXXXXXXXXXXXX
  34. """
  35. s3 = """
  36. XOOOOX
  37. X X
  38. X X
  39. X XXX
  40. X X
  41. X X
  42. XXXXXX
  43. """
  44. s4 = """
  45. XXXXXXXXXXXXX
  46. O X
  47. O X X
  48. O X X
  49. O X
  50. XXXXXXXXXXXXX
  51. """
  52. def to_board(s):
  53. return [[*i] for i in filter(None, s.split('\n'))]
  54.  
  55. print('\n'.join(map(''.join,f(to_board(s1)))))
  56. print('-'*40)
  57. print('\n'.join(map(''.join,f(to_board(s2)))))
  58. print('-'*40)
  59. print('\n'.join(map(''.join,f(to_board(s3)))))
  60. print('-'*40)
  61. print('\n'.join(map(''.join,f(to_board(s4)))))
Success #stdin #stdout 0.14s 14068KB
stdin
Standard input is empty
stdout
XXXX*OO%XXXX
X<<<v^><<<^X
Xv>>>>v>>>>X
XXXXXXXXXXXX
----------------------------------------
X*OOO%X
Xv^>^>X
Xv^v<^X
Xv^v^>XXXXXXXX
Xv^v<<<<<<<<^X
Xv>v>>>>>>>>>X
XXXXXXXXXXXXXX
----------------------------------------
X*OO%X
Xv^>^X
Xv^v>X
Xv^XXX
Xv<<^X
Xv>>>X
XXXXXX
----------------------------------------
XXXXXXXXXXXXX
*>>>>>>^>^>>X
O<^<^Xv^v^<vX
Ov^v^Xv>v>v>X
%v<v<<<<<<<vX
XXXXXXXXXXXXX