fork download
  1. E=enumerate
  2. def S(b,x,y):
  3. q=[(x,y,0,0,b[x][y],[(x,y)])]
  4. while q:
  5. n,m,j,k,t,p=q.pop(0)
  6. for X,Y in[(1,0),(-1,0),(0,1),(0,-1)]:
  7. N=n+X;M=m+Y;F=0;J=j;K=k
  8. if(A:=N<0)or M<0:J,K=j+A,k-(M<0);yield J,K,0;N=[N,len(b)-1][A];M=[M,len(b[0])-1][Y<0];F=1
  9. elif(A:=N>=len(b))+(B:=M>=len(b[0])):J,K=j-A,k+B;yield J,K,0;N*=1-A;M*=1-B;F=1
  10. if((N,M)==(x,y))*(Z:=1>(z:=b[N][M])or t):yield J,K,1,p
  11. elif(Z+F)*~-((N,M)in p):q+=(N,M,*([[J,K],[0,0]][z<1>F and t]),z,p+[(N,M)]),
  12. def f(t,b):
  13. for x,a in E(b):
  14. for y,_ in E(a):
  15. K={0:set(),1:set()};g,h=t
  16. for z,v,F,*_ in S(b,x,y):
  17. if((v,z)==t)>F:return 1
  18. if F:K[0].add(v);K[1].add(z)
  19. if any(all([[(g<0)==(G<0),g%G<1]if G else[0],[G==0]][g==0]+[[(h<0)==(H<0),h%H<1]if H else[0],[H==0]][h==0])for G in K[0]for H in K[1]):return 1
  20. return 0
  21.  
  22. #note: times out on the largest test cases
  23. print(f((-2,0),[[1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1]]))
  24. print(f((0, 2), [[1, 0, 1], [0, 1, 0], [1, 0, 1]]))
  25. #print(f((2, 2), [[1, 0, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 0, 1, 0, 1, 1], [1, 1, 1, 0, 1, 0, 1, 0, 1], [0, 1, 0, 1, 1, 1, 1, 1, 0], [1, 0, 1, 1, 1, 1, 1, 1, 1]]))
  26. print(f((-2, -2), [[0, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1]]))
  27. print(f((100, 100), [[1, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]))
  28. print(f((1, -1), [[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]]))
  29. print(f((-123, 456), [[0, 0, 1, 0, 0], [1, 1, 1, 0, 0], [0, 0, 1, 1, 1], [0, 0, 1, 0, 0]]))
  30. #print(f((-200, 100), [[1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0], [0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1], [1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0], [1, 1, 0, 1, 1, 1, 0, 1, 1, 1 ,1 ,1 ,0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]]))
Success #stdin #stdout 0.4s 15212KB
stdin
Standard input is empty
stdout
0
0
1
1
1
1