fork download
  1. def O(b,x,y,X,Y):
  2. for A,B in[(0,1),(0,-1),(1,0),(-1,0),(1,1),(1,-1),(-1,1),(-1,-1)]:
  3. if X>(j:=x+A)>-1<(k:=y+B)<Y and'XX'!=b[j][k]:yield(j,k,b[j][k])
  4. def f(b):
  5. b=[[int(j)if j.isdigit()else j for j in i.split()]for i in b.split('\n')];u=len(b);v=len(b[0]);k=[(X//v,X%v)for X in range(u*v)]
  6. if len(d:=[(x,y)for x,y in k if type(b[x][y])==int])==1:return
  7. s,e=min(d,key=(_:=lambda x:b[x[0]][x[1]])),max(d,key=_);q,a=[(s,{(x,y)for x,y in k if b[x][y]=='--'},b)],[];D=[b[x][y]for x,y in d]
  8. while q:
  9. (X,Y),W,B=q.pop(0);T=[]
  10. if(X,Y)==e and W==set():return'\n'.join(' '.join(str(j).zfill(2)for j in i)for i in B)
  11. for x,y,C in O(B,X,Y,u,v):
  12. if-~B[X][Y]==C:q+=((x,y),W,B),;T=[];break
  13. if'--'==C and-~B[X][Y]not in D:
  14. U=eval(str(B));U[x][y]=B[X][Y]+1
  15. if~-(U in a):T+=((x,y),W-{(x,y)},U),;a+=U,
  16. q+=T
  17.  
  18. print(f('01 XX 03'))
  19. print(f('01 -- 04'))
  20. print(f('01 --'))
  21. print(f("""01 -- --
  22. -- XX 05"""))
  23. print(f("""-- 33 35 -- -- XX XX XX
  24. -- -- 24 22 -- XX XX XX
  25. -- -- -- 21 -- -- XX XX
  26. -- 26 -- 13 40 11 XX XX
  27. 27 -- -- -- 09 -- 01 XX
  28. XX XX -- -- 18 -- -- XX
  29. XX XX XX XX -- 07 -- --
  30. XX XX XX XX XX XX 05 --"""))
Success #stdin #stdout 0.25s 14128KB
stdin
Standard input is empty
stdout
None
None
None
01 03 04
02 XX 05
32 33 35 36 37 XX XX XX
31 34 24 22 38 XX XX XX
30 25 23 21 12 39 XX XX
29 26 20 13 40 11 XX XX
27 28 14 19 09 10 01 XX
XX XX 15 16 18 08 02 XX
XX XX XX XX 17 07 06 03
XX XX XX XX XX XX 05 04