Noname > 19-03-20, 09:29 AM
Noname > 19-03-20, 09:33 AM
paulsteigel > 23-03-20, 09:46 AM
(19-03-20, 09:33 AM)Noname Đã viết: Thử lại cập nhật mới nhất.Giải Sudoku bắt buộc phải dùng 2 biện pháp kết hợp ông Tuấn ạ,
Giải thuật:
1. Điền các ô trống các số 123456789. Tạo 1 bản lưu
2. Nếu kiểm tra nhóm (9 ô), hàng, cột có ô có len =1 thì xóa số đó trong các ô khác thuộc hàng/nhóm tương ứng
3. Nếu kiểm tra nhóm, hàng, cột có ô len =2, và countif (vùng kiểm tra, giá trị của ô đó) =2
Thì xóa 2 số đó ở các ô còn lại trong vùng kiểm tra
Thêm được 1 bước:
4. Kiểm tra trong 1 nhóm, Quét từ 1 đến 9, nếu count của hai số đều bằng 2 và 2 số chung 1 địa chỉ ô, thì xóa hết các số khác trong ô đó.
5. Xét 1 dòng r. Nếu có giá trị n có count(n)=2 thì
Kiểm tra 2 ô chứa n có nằm trên cùng 1 vùng 3x3 không.
Nếu nằm trên cùng 1 vùng thì: loại bỏ giá trị n, trừ 2 ô chứa n thuộc dòng r đã xét bên trên
6. Kiểm tra bảng tính sau khi hoàn thành 5 bước xem hoàn thành chưa
If chưa hoàn thành then
if thay đổi then
Lặp lại từ bước 2
else
thực hiện bước 7
end if
end if
Bước 7.
Tìm 1 ô có 2 số, thử nghiệm gán ô đó bằng số bên trái, lặp lại từ bước 2
Kiểm tra xem ra kết quả có sai không
Nếu sai, trả về giá trị từ bảng lưu, thử nghiệm gán ô đó bằng số bên phải
https://www.dropbox.com/s/dgucf330dnj9qo....xlsm?dl=0
Chưa hoàn thành 100% nhưng dự đoán cần thêm 1 bước nữa.
File này hiện tại giải được 90% bài toán sudoku độ siêu khó
Noname > 23-03-20, 03:23 PM
(23-03-20, 09:46 AM)paulsteigel Đã viết:(19-03-20, 09:33 AM)Noname Đã viết: Thử lại cập nhật mới nhất.Giải Sudoku bắt buộc phải dùng 2 biện pháp kết hợp ông Tuấn ạ,
Giải thuật:
1. Điền các ô trống các số 123456789. Tạo 1 bản lưu
2. Nếu kiểm tra nhóm (9 ô), hàng, cột có ô có len =1 thì xóa số đó trong các ô khác thuộc hàng/nhóm tương ứng
3. Nếu kiểm tra nhóm, hàng, cột có ô len =2, và countif (vùng kiểm tra, giá trị của ô đó) =2
Thì xóa 2 số đó ở các ô còn lại trong vùng kiểm tra
Thêm được 1 bước:
4. Kiểm tra trong 1 nhóm, Quét từ 1 đến 9, nếu count của hai số đều bằng 2 và 2 số chung 1 địa chỉ ô, thì xóa hết các số khác trong ô đó.
5. Xét 1 dòng r. Nếu có giá trị n có count(n)=2 thì
Kiểm tra 2 ô chứa n có nằm trên cùng 1 vùng 3x3 không.
Nếu nằm trên cùng 1 vùng thì: loại bỏ giá trị n, trừ 2 ô chứa n thuộc dòng r đã xét bên trên
6. Kiểm tra bảng tính sau khi hoàn thành 5 bước xem hoàn thành chưa
If chưa hoàn thành then
if thay đổi then
Lặp lại từ bước 2
else
thực hiện bước 7
end if
end if
Bước 7.
Tìm 1 ô có 2 số, thử nghiệm gán ô đó bằng số bên trái, lặp lại từ bước 2
Kiểm tra xem ra kết quả có sai không
Nếu sai, trả về giá trị từ bảng lưu, thử nghiệm gán ô đó bằng số bên phải
https://www.dropbox.com/s/dgucf330dnj9qo....xlsm?dl=0
Chưa hoàn thành 100% nhưng dự đoán cần thêm 1 bước nữa.
File này hiện tại giải được 90% bài toán sudoku độ siêu khó
* Phần 1 là luận lý logic: đánh giá khả năng của một số theo quan hệ của nó ngang dọc, ô vuông: các bài dễ thì đoán được hầu hết, còn lại các các trường hợp 50/50 hoặc 3/3
* Phần 2: thử khả năng với các trường hợp 50/50, 3/3 hoăc khác nữa: dùng đệ quy, biến nhớ và thử
Các bài chuyên gia đa phần chỉ điền được một vài số theo phần lô gic còn lại là đánh giá thử nghiệm phần 2.
Tôi trước cũng từng làm một cái nhưng lâu quá rồi, vứt đâu mất rồi, cách làm tôi cũng đi theo 2 bước tiếp cận này, hầu hết đều ra với bước 2. Giờ quên mất code (vứt đâu mất).
Với bài của Tuấn thì phần xử lý thử chưa thực hiện được. Cách làm trước đây của tôi là chọn kết hợp nhỏ nhất để thử lần lượt, khi thử thì có mảng nhớ 9x9 (chỉ cần nhớ tình trạng khi bắt đầu thử) sau đó dùng đệ quy tìm kiếm cạn kiệt (exhaustive search), nếu sai thì quay về và thử tiếp (chắc chắn sẽ ra, trừ khi bài ra bị sai).
Tùy theo bảng mà tốc độ nhanh hay chậm.
Bài sau đây (tôi chả đăng được ảnh), phần dò luận lý của Tuấn chỉ điền thêm được 4 số thôi còn dừng lại.
8 '- '- '- '- '- '- '- '-
'- 4 '- '- '- '- '- 6 '-
'- '- 6 4 '- '- '- 1 '-
'- '- '- 5 '- '- 9 '- '-
'- 1 '- '- '- '- '- '- 8
'- '- 3 '- 9 7 '- '- 5
'- '- '- '- 8 5 '- '- '-
'- '- '- 7 '- 4 1 2 '-
7 '- '- 2 '- '- '- '- '-
paulsteigel > 23-03-20, 04:54 PM
(23-03-20, 03:23 PM)Noname Đã viết:Chúc mừng ông Tuấn, tốc độ tính nhanh gần bằng Java! (giải thuận Java cũng tương tự vậy nhưng họ xử lý mảng nên nhanh hơn tương đối).(23-03-20, 09:46 AM)paulsteigel Đã viết:(19-03-20, 09:33 AM)Noname Đã viết: Thử lại cập nhật mới nhất.Giải Sudoku bắt buộc phải dùng 2 biện pháp kết hợp ông Tuấn ạ,
Giải thuật:
1. Điền các ô trống các số 123456789. Tạo 1 bản lưu
2. Nếu kiểm tra nhóm (9 ô), hàng, cột có ô có len =1 thì xóa số đó trong các ô khác thuộc hàng/nhóm tương ứng
3. Nếu kiểm tra nhóm, hàng, cột có ô len =2, và countif (vùng kiểm tra, giá trị của ô đó) =2
Thì xóa 2 số đó ở các ô còn lại trong vùng kiểm tra
Thêm được 1 bước:
4. Kiểm tra trong 1 nhóm, Quét từ 1 đến 9, nếu count của hai số đều bằng 2 và 2 số chung 1 địa chỉ ô, thì xóa hết các số khác trong ô đó.
5. Xét 1 dòng r. Nếu có giá trị n có count(n)=2 thì
Kiểm tra 2 ô chứa n có nằm trên cùng 1 vùng 3x3 không.
Nếu nằm trên cùng 1 vùng thì: loại bỏ giá trị n, trừ 2 ô chứa n thuộc dòng r đã xét bên trên
6. Kiểm tra bảng tính sau khi hoàn thành 5 bước xem hoàn thành chưa
If chưa hoàn thành then
if thay đổi then
Lặp lại từ bước 2
else
thực hiện bước 7
end if
end if
Bước 7.
Tìm 1 ô có 2 số, thử nghiệm gán ô đó bằng số bên trái, lặp lại từ bước 2
Kiểm tra xem ra kết quả có sai không
Nếu sai, trả về giá trị từ bảng lưu, thử nghiệm gán ô đó bằng số bên phải
https://www.dropbox.com/s/dgucf330dnj9qo....xlsm?dl=0
Chưa hoàn thành 100% nhưng dự đoán cần thêm 1 bước nữa.
File này hiện tại giải được 90% bài toán sudoku độ siêu khó
* Phần 1 là luận lý logic: đánh giá khả năng của một số theo quan hệ của nó ngang dọc, ô vuông: các bài dễ thì đoán được hầu hết, còn lại các các trường hợp 50/50 hoặc 3/3
* Phần 2: thử khả năng với các trường hợp 50/50, 3/3 hoăc khác nữa: dùng đệ quy, biến nhớ và thử
Các bài chuyên gia đa phần chỉ điền được một vài số theo phần lô gic còn lại là đánh giá thử nghiệm phần 2.
Tôi trước cũng từng làm một cái nhưng lâu quá rồi, vứt đâu mất rồi, cách làm tôi cũng đi theo 2 bước tiếp cận này, hầu hết đều ra với bước 2. Giờ quên mất code (vứt đâu mất).
Với bài của Tuấn thì phần xử lý thử chưa thực hiện được. Cách làm trước đây của tôi là chọn kết hợp nhỏ nhất để thử lần lượt, khi thử thì có mảng nhớ 9x9 (chỉ cần nhớ tình trạng khi bắt đầu thử) sau đó dùng đệ quy tìm kiếm cạn kiệt (exhaustive search), nếu sai thì quay về và thử tiếp (chắc chắn sẽ ra, trừ khi bài ra bị sai).
Tùy theo bảng mà tốc độ nhanh hay chậm.
Bài sau đây (tôi chả đăng được ảnh), phần dò luận lý của Tuấn chỉ điền thêm được 4 số thôi còn dừng lại.
8 '- '- '- '- '- '- '- '-
'- 4 '- '- '- '- '- 6 '-
'- '- 6 4 '- '- '- 1 '-
'- '- '- 5 '- '- 9 '- '-
'- 1 '- '- '- '- '- '- 8
'- '- 3 '- 9 7 '- '- 5
'- '- '- '- 8 5 '- '- '-
'- '- '- 7 '- 4 1 2 '-
7 '- '- 2 '- '- '- '- '-
Về cơ bản ý tưởng thì mình cũng làm giống bác.
Sau 6 bước logic bị bí, mình chuyển sang bước 7 với phép thử.
Hôm trước chưa hoàn thiện bước 7. Hôm nay post lại, thử luôn trên ví dụ của bác.
Tải file đầy đủ và nhấn Ctrl +W để bắt đầu
https://1drv.ms/u/s!Akn0wxTkFmj1gbMtfx-f...Q?e=n4pcpw
@Về post hình vào diễn đàn, mình đang dùng https://imgur.com/ để post hình, copy link và dán vào diễn đàn có vẻ ok lắm. Mấy hôm dùng photobuket mà sau này trang này ẹ quá, facebook còn cấm tiệt link photobuket luôn