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)

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