fork download
  1. E=enumerate
  2. M=(0,1),(1,0),(-1,0),(0,-1),(1,1),(-1,1),(1,-1),(-1,-1)
  3. m,g,p='MF.'
  4. def f(F):
  5. q,s=[({(x,y):v for x,r in E(F)for y,v in E(r)},0)],[]
  6. for d,C in q:
  7. R=Q=[(d,0)];T=[]
  8. for D,c in Q:
  9. if~c%2:
  10. [v]=[i for i in D if m==D[i]]
  11. for X,Y in M:
  12. if-1==D.get(V:=(v[0]+X,v[1]+Y),-1):R=0
  13. elif(g!=D[V])>((U:={**D,v:p,V:m})in T):Q+=(U,c+1),;T+=U,
  14. else:S=[V for v in D for X,Y in M if g==D[v]and D.get(V:=(v[0]+X,v[1]+Y),-1)in[m,p]];Q+=[({**D,**{i:g for i in S if p==D[i]}},c+1)]*all(m!=D[i]for i in S)
  15. if R:return C
  16. for i in d:
  17. if(p==d[i])>((U:={**d,i:g})in s):q+=(U,C+1),;s+=U,
  18.  
  19. def to_board(s):
  20. return [[*i] for i in filter(None, s.split('\n'))]
  21. s = """
  22. FFFFF
  23. F...F
  24. F.M.F
  25. F...F
  26. FFFFF
  27. """
  28. s1 = """
  29. FFFFF
  30. F....
  31. F....
  32. F....
  33. F.M..
  34. F....
  35. F....
  36. F....
  37. FFFFF
  38. """
  39. s2 = """
  40. .....
  41. .....
  42. ..M..
  43. .....
  44. .....
  45. """
  46. print(f(to_board(s)))
  47. print(f(to_board(s1)))
  48. print(f(to_board(s2)))
Success #stdin #stdout 0.4s 14120KB
stdin
Standard input is empty
stdout
0
1
2