fork download
  1. C=lambda x:[x[:2]]+C(x[2:])if[]<x else[]
  2. E=enumerate
  3. def f(a,b,c):
  4. A,B,F=dict(C(a)+[(k,j)for j,k in C(a)]),dict(C(b)+[(k,j)for j,k in C(b)]),0
  5. q,S=[(c,[(x,y)for x,r in E(c)for y,v in E(r)if'.'==v])],[]
  6. for c,l in q:
  7. if[]==l:return c
  8. (x,y),*l=l
  9. for t in'SM':
  10. e=eval(str(c));e[x][y]=t
  11. if all(all(m*3not in''.join(k)for k in e+[*zip(*e)])for m in'SM')and all('.'in j or j.count('M')==j.count('S')for j in e+[*zip(*e)])and e not in S:
  12. F=1
  13. if(x,y)in A:X,Y=A[(x,y)];F=e[X][Y]in['.',t]
  14. elif(x,y)in B:X,Y=B[(x,y)];F=e[X][Y]=='.'or e[X][Y]!=t
  15. if F:q+=[(e,l)];S+=e,
  16.  
  17. s1= """
  18. .MSSM.
  19. M....M
  20. S....M
  21. S....S
  22. M....S
  23. .SMMS.
  24. """
  25.  
  26. s2 = """
  27. MS....
  28. M...SM
  29. SM..M.
  30. .S..MS
  31. SM...M
  32. ....MS
  33. """
  34.  
  35. s3 = """
  36. ......
  37. ......
  38. ..S.S.
  39. .M.S..
  40. ......
  41. ......
  42. """
  43.  
  44. s4 = """
  45. ..SS..
  46. ......
  47. ......
  48. ......
  49. ......
  50. ......
  51. """
  52.  
  53. def to_board(s):
  54. return [[*i] for i in filter(None, s.split('\n'))]
  55.  
  56. def get_board(s):
  57. return '\n'.join(map(''.join,s))
  58.  
  59. print(get_board(f([(1,1), (2,1), (3,1), (3,2)],[(1,2), (2,2), (1,3), (1,4), (2,3), (2,4), (3,3), (4,3), (3,4), (4,4), (4,1), (4,2)],to_board(s1))))
  60. print('-'*40)
  61. print(get_board(f([(2,2), (2,3), (2,3), (3,3)],[(3,2), (3,3), (2,2), (3,2)],to_board(s2))))
  62. print('-'*40)
  63. print(get_board(f([(0,1), (1,1), (1,0), (2,0), (2,5), (3,5), (3,0), (4,0), (4,0), (4,1)],[(0,1), (0,2), (0,3), (0,4), (0,4), (1,4), (1,0), (1,1), (1,4), (1,5), (1,5), (2,5), (2,0), (3,0), (3,5), (4,5), (4,4), (4,5), (4,4), (5,4), (5,3), (5,4), (5,1), (5,2), (4,1), (5,1)],to_board(s3))))
  64. print('-'*40)
  65. print(get_board(f([(1,2), (2,2), (2,1), (3,1), (3,2), (3,3), (4,0), (5,0), (5,1), (5,2), (5,3), (5,4), (4,5), (5,5)],[(1,3), (2,3), (2,4), (3,4), (4,1), (4,2), (4,3), (4,4)],to_board(s4))))
Success #stdin #stdout 0.44s 14208KB
stdin
Standard input is empty
stdout
MMSSMS
MSSMSM
SSMSMM
SMMSMS
MMSMSS
SSMMSM
----------------------------------------
MSMMSS
MSSMSM
SMSSMM
MSMSMS
SMSMSM
SMMSMS
----------------------------------------
SSMSMM
MSSMSM
MMSMSS
SMMSMS
SSMMSM
MMSSMS
----------------------------------------
SMSSMM
MSMMSS
SMMSSM
SMSSMM
MSMMSS
MSSMMS