Giải Sudoku 9x9 (Nâng Cao)

Hôm nay chúng ta sẽ có thêm một cách tiếp cận mới để giải Sudoku trong Excel, và bài toán lần này được nâng cấp lên ma trận 9×9.

Note: Đảm bảo mỗi số 1–9 chỉ xuất hiện một lần theo hàng, cột và vùng 3×3.

Link: Onedrive


Công thức:
1.=LET(z,A2:I10,r,SEQUENCE(9),c,TOROW(r),g,INT((r-1)/3)*3+INT((c-1)/3),
Avai,LAMBDA(u,MAKEARRAY(9,9,LAMBDA(i,j,LET(y,INDEX(u,i,j),
IF(y,y,IFERROR(--CONCAT(REPT(r,ISERR(FIND(r,CONCAT(REPT(u,(r=i)+(c=j)+(INDEX(g,i,j)=g))))))),)))))),

Obvious,LAMBDA(av,REDUCE(av,MOD(SEQUENCE(81,,0),81)+1,LAMBDA(a,n,LET(i,ROUNDUP(n/9,),j,MOD(n-1,9)+1,x,INDEX(a,i,j),l,LEN(x),cr,(l>1)*(l<4),
IF(cr,REDUCE(a,{1,2,3},LAMBDA(aa,nn,LET(h,SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(aa,RIGHT(x),),LEFT(x),),MID(x,2,1),),hn,IFERROR(--h,aa),
CHOOSE(nn,IF((SUM(N(INDEX(h,i,)=""))=l)*(r=i),hn,aa),IF((SUM(N(INDEX(h,,j)=""))=l)*(c=j),hn,aa),IF((SUM((h="")*(g=INDEX(g,i,j)))=l)*(g=INDEX(g,i,j)),hn,aa) )))),a))))),

HidenO,LAMBDA(O,MAKEARRAY(9,9,LAMBDA(i,j,LET(nn,INDEX(O,i,j),ns,MID(nn,SEQUENCE(LEN(nn)),1),
gg,CONCAT(REPT(O,INDEX(g,i,j)=g)),rr,CONCAT(INDEX(O,i,)),cc,CONCAT(INDEX(O,,g)),
IF(nn<10,nn,--XLOOKUP(1,VSTACK(LEN(gg)-LEN(SUBSTITUTE(gg,ns,)),LEN(rr)-LEN(SUBSTITUTE(rr,ns,)),LEN(cc)-LEN(SUBSTITUTE(cc,ns,))),VSTACK(ns,ns,ns),0)))))),

Pointing,LAMBDA(av,gn,x,REDUCE(av,SEQUENCE(6),LAMBDA(a,n,
LET(sg,g=gn,cn,LEN(a)-LEN(SUBSTITUTE(a,x,)),tog,SUM(sg*cn),
rc,MOD(n-1,3)+1+IF(n>3,MOD(gn,3)*3,INT(gn/3)*3),r_c,IF(n>3,rc=c,rc=r),
IFERROR(--IF(tog>1,IF((SUM(r_c*sg*cn)=tog)*r_c*(g<>gn),SUBSTITUTE(a,x,),a),a),))))),

Grid,REDUCE(z,SEQUENCE(20),LAMBDA(a,n,IF(SUM(a)=405,a,
HidenO(Obvious(REDUCE(Obvious(Avai(a)),SEQUENCE(9)-1,LAMBDA(c,gn,REDUCE(c,SEQUENCE(9),LAMBDA(a,n,Pointing(a,gn,n)))))))))),
Grid)

2.=LET(a,A2:I10,b,ROW(1:9),c,TOROW(b),d,INT((b-1)/3)*3+INT((c-1)/3),REDUCE(a,SEQUENCE(9),LAMBDA(x,v,MAKEARRAY(9,9,LAMBDA(i,s,LET(y,INDEX(x,i,s),x,IF(y,y,--CONCAT(REPT(b,ISERR(FIND(b,CONCAT(REPT(x,(b=i)+(TOROW(b)=s)+(INDEX(d,i,s)=d)))))))),(x<10)*x))))))

3.=LET(a,A2:I10,LET(f,LAMBDA(h,x,LET(b,N(+x),c,XMATCH(0,TOCOL(b)),d,UNIQUE(VSTACK(TOCOL(INDEX(b,CEILING.MATH(c/9,1),)),INDEX(b,,MOD(c-1,9)+1),TOCOL(INDEX(b,SEQUENCE(3,,CEILING.MATH(c/9,3)-2),SEQUENCE(,3,FLOOR.MATH(MOD(c-1,9),3)+1))),SEQUENCE(9)),,1),h,LAMBDA(l,x,a,IF(ROWS(x)<a,,LET(e,h(h,IF(c=SEQUENCE(9,9),INDEX(x,a),b)),IF(AND(e),e,l(l,x,a+1))))),IFERROR(h(h,FILTER(d,d<>0),1),b))),f(f,a)))

4.Python (Xem trong file)

1 Nhận xét

  1. A ơi a có thể giải thích thêm về hướng tư duy, xây dựng công thức k ạ

    Trả lờiXóa
Đăng nhận xét
Mới hơn Cũ hơn