fork download
  1. from random import*
  2. from itertools import*
  3. N=len
  4. R=range
  5. def O(b,s,e,x,y,n=[],r=[]):
  6. if[]==s:yield e;return
  7. j,k=s[0]
  8. if N(p:={(J:=k-j*~y,X:=~j*~y+k),(J+1,X+1),(J,J+1),(X,X+1)}-{*r})>=b[j][k]:
  9. for i in combinations(p,b[j][k]):
  10. T=p-{*i}
  11. if~-any(q in n for q in T):
  12. E=eval(str(e))
  13. for A,B in T:E[A].remove(B);E[B].remove(A)
  14. if all(N(E[A])>1for A in E):yield from O(b,s[1:],E,x,y,n+[*i],r+[*T])
  15. def f(x,y,d,t=' '):
  16. while 1:
  17. s=[0]*(x*y-(L:=x*y*d//20))+[randint(1,3)for _ in R(L)];shuffle(s);b=[s[i:i+y]for i in R(0,N(s),y)];k=-1;B=[[(k:=k+1)for _ in R(y+1)]for _ in R(x+1)];D={};T=t.join
  18. def U(B,x,y,X,Y):
  19. try:D[B[x][y]]=D.get(B[x][y],[])+[B[X][Y]]
  20. except:1
  21. for Z in R(~y*~x):U(B,X:=Z//-~x,Y:=Z%-~x,X,Y+1);U(B,X,Y,X+1,Y);U(B,X,Y+1,X,Y);U(B,X+1,Y,X,Y)
  22. if O(b,[(X//y,X%y)for X in R(x*y)if b[X//y][X%y]],D,x,y):return'\n'.join([T(['+']*N(H))+'\n '+T([t,str(u)][u>0]for u in G)for H,G in zip(B,b)]+[T(['+']*N(B[0]))])
  23.  
  24. print(f(5,5,8))
Success #stdin #stdout 0.11s 14252KB
stdin
Standard input is empty
stdout
+ + + + + +
     1 2 1
+ + + + + +
       1  
+ + + + + +
   1 3 2  
+ + + + + +
   3 3    
+ + + + + +
     1    
+ + + + + +