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