Chọn số ngẫu nhiên – Random Number Piking

Một phần của tài liệu nghiên cứu xây dựng hệ điều hành cho windows_phone” (Trang 40 - 43)

Phần khó khăn nhất là để khám phá những chiến lược đúng để chọn các số ngẫu nhiên mà không có sự lặp lại theo cột và hàng. Em quyết định sử dụng kỹ thuật Naked Pairs / Naked Triplets, mà em tham khảo từ một số

trang web dành riêng cho việc giải quyết Sudoku. Đối với việc chọn số ngẫu nhiên, hàm GenerateNumbers() xây dựng như sau:

private void GenerateNumbers() {

ResetBoard();

Random rnd = new Random(); string number = "0";

int minSize = size; int maxSize = 0;

while (someSolved) {

someSolved = false;

//Tìm kiếm naked pairs trong hàng

if (!someSolved) {

}

//Tìm kiếm naked pairs trong cột

if (!someSolved) {

}

//Tìm kiếm naked triplets trong hàng

for (int row = 0; row < size; row++) {

}

//Tìm ô chỉ có thể thỏa mãn 1 giá trị

for (int row = 0; row < size; row++) {

}

//Random selection

if (!someSolved) {

Naked pairs: Trong một số hàng/cột, có 2 ô/cell với 2 giá trị có thể điền vào. Ví dụ hình sau chúng ta có thể phát hiện 2 ô trong lồng bên trái phía dưới chỉ có thể điền 2 giá trị [1,3]:

Hình 3.6 – Naked Pairs

Lý do cho việc tìm kiếm cặp số thỏa mãn – Naked Pairs rất đơn giản: kể từ khi hai ô này chỉ có thể giữ hai chữ số, không có các ô khác trong dòng đó sẽ có "1" hoặc "3". Vì vậy chúng ta có thể loại bỏ chúng từ các chữ số có thể:

Trong thuật toán trên, có thể thấy việc xét các trọng số để điền vào từng ô được thực hiện theo thứ tự: 2 kết quả có thể hợp lệ (Naked pairs), sau đó tới 3 kết quả có thể điền (Nake Tripple) và sau cùng là 1 khả năng duy nhất. Sau khi thực hiện hàm GenerateNumbers() ta có được một bảng số – Boards đáp án dánh cho người chơi theo đúng quy luật.

Hình 3.7- Đáp án

Một phần của tài liệu nghiên cứu xây dựng hệ điều hành cho windows_phone” (Trang 40 - 43)