
Nguyên bản được gửi bởi
Tadius
Nói thật với bạn thuật toán phát sinh ra một Sodoku cấp n là NPC khó. Vì thế mà @@.
Còn thuật toán giải thì lại đỡ phức tạp hơn.
Thuật toán giải Sodoku có tư tưởng như sau:
1. Giả sử bạn đang xét hàng cột j. Bạn sẽ lọc ra một tập C gọi là tập các ô số chưa biết (chưa được lật).
2. Với mỗi một phần tử chưa biết trên cột j, phần tử đó nằm ở hàng i ta ký hiệu S[i,j] ta làm như sau:
+ Trên hàng i ta tìm các số chưa biết trên hàng I được tập R. Đem tập R giao với tập C. Tập P=C.R (P=C giao C) là tập chứa các số có thể đặt vào trong ô S[i,j].
+ Với mỗi P ta xem xét tới xác xuất xuất hiện của một chữ số trong P bởi việc tìm ra các phần tử trong các tập P xuất hiện ít nhât. Sau đó sẽ tiến hành điền vào ma trận.
Lặp lại tới khi Sodoku bị lật hết thì thôi
Ví dụ đơn giản Sodoku 4*4: Nguyên bản như sau để sau này tiện so sánh
1 2 3 4
2 3 4 1
3 4 2 1
4 1 2 3
Ta có Sodoku 4*4 chưa giải là:
1 x x x
x x 4 x
x 4 x x
x x x 3
+Xét cột 1 : Tập C[1]={2,3,4} là các số chưa được điền vào cột 1.
-Xét hàng 2: R[2]={1,2,3} là các số chưa được điền trong hàng 2.
-Ta có P[2,1]=C[1] giao R[2] = {2,3} là tập chứa số có thể được điền vào
ô S[2,1]. (S là ma trận Sodoku ở hàng 2, cột 1).
-Xét hàng 3 : R[3]={1,2,3} => P[3,1]={2,3}.
-Xét hàng 4 : R[4]={1,2,4} => P[4,1]={2,4}.
Nhận xét P[2,1]={2,3,}, P[3,1]={2,3}, P[4,1]={2,4}.
Thấy rằng phần số 4 chỉ có thể xuất hiện ở hàng 4 mà thôi. Vậy ta biết điền được S[4,1]=4. Tức là ta có
1 x x x
x x 4 x
x 4 x x
4 x x 3
Cứ thế xét các hàng/cột tiếp theo tới khi hết Sodoku thì thôi.
Sorry về phần thuật toán phát sinh Sodoku rằng mình đã phát biểu nó là NPC khó. Thực ra mình vừa nghĩ ra thuật toán sinh Sodoku với chỉ số hàng,cột tính bắt đầu từ 1 là
Sodoku cơ bản ô S[i,j]=k;
Với k được tính như sau:
k= (i+j-1)%(n+1)
if (k=0) then k=1;
Từ đó có thể hoán vị hàng hoặc cột => Sodoku cấp n có n^2 Sodoku cùng cấp tương đương.