Gần đây tôi đã có một ứng dụng Sudoku mới tạo ra các Sudoku thực sự khó, không thể giải quyết bằng các chiến lược tiêu chuẩn. Vì vậy, tôi đã phải học một vài cái mới. Một trong những chiến lược là chiến lược Y-Wing . Nó được xếp hạng theo "Chiến lược cứng rắn", nhưng thực sự không khó lắm.
Thí dụ
Đối với chiến lược này chỉ có 4 ô là quan trọng. Vì vậy, tôi bỏ qua tất cả các tế bào khác trong hình ảnh.
Chúng tôi xem xét tất cả các ứng cử viên cho mỗi tế bào. Trong ví dụ sau, chúng tôi có một ô có các ứng cử viên 3 7
(có nghĩa là chúng tôi đã từ chối các ứng cử viên 1 2 4 5 6 8 9
, ví dụ vì có một 1
hàng 2
trong cùng một ô, trong cùng một hộp 3x3, ...), một ô có các ứng cử viên 6 7
, một tế bào với các ứng cử viên 3 6
và một tế bào với các ứng cử viên 2 6
. Chiến lược Y-Wing sẽ đề xuất rằng, 6
có thể loại bỏ khỏi các ứng cử viên của ô thẳng đứng, chỉ để lại một 2
ứng cử viên mà bạn có thể điền vào. Vì vậy, chúng tôi đã tìm thấy một số chính xác và tiến gần hơn một bước trong việc giải Sudoku đầy đủ.
Tại sao có thể 6
được gỡ bỏ?
Giải trình
Chúng ta hãy giả sử rằng đó 6
là số chính xác cho ô thẳng đứng. Bây giờ có một 6
cột trong cột này, do đó chúng ta có thể loại bỏ 6
khỏi các ứng cử viên của ô trên cùng bên phải, chỉ để lại một 7
, mà chúng ta có thể điền vào. Điều tương tự xảy ra với ô bên trái. Chúng tôi có thể loại bỏ 6
và điền vào 3
. Bây giờ nếu chúng ta nhìn vào ô trên cùng bên trái, chúng ta sẽ có một mâu thuẫn. Bởi vì bây giờ có đã là một 7
trong cùng hàng và 3
trong cùng một cột, vì vậy chúng ta có thể loại bỏ các 7
và 3
các ứng cử viên, không để lại các ứng cử viên ở tất cả. Mà rõ ràng là không thể. Do đó, 6 không thể là số chính xác của ô thẳng đứng.
Chính xác hơn: Nếu chúng ta có 4 ô với các ứng cử viên [A B] [A C] [C D] [B C]
(theo thứ tự này hoặc xoay tròn) và các ô được kết nối (qua cùng một hàng, cùng một cột hoặc cùng một hộp 3x3) trong một vòng tròn (Ô 1 được kết nối với Ô 2, đó là được kết nối với Ô 3, được kết nối với Ô 4, được kết nối với Ô 1), hơn là bạn có thể xóa C
khỏi [C D]
ô. Nó là rất quan trọng, rằng ba loại tế bào [A B]
, [A C]
và [B C]
chỉ chứa hai ứng cử viên từng. Khác biệt các ô [C D]
, có thể chứa nhiều hơn hoặc ít hơn ( D
có thể bằng 0, một hoặc thậm chí nhiều ứng cử viên).
Lưu ý rằng tôi nói rõ ràng rằng họ có thể được kết nối một trong hai cách. Trong ví dụ tiếp theo, bạn có thể thấy chiến lược được áp dụng lại. Nhưng lần này, 4 ô không tạo thành hình chữ nhật. Các ô bên trái và xuống dưới được kết nối đơn giản, vì chúng nằm trong cùng một hộp 3x3. Y-Wing nói rằng chúng ta có thể loại bỏ 1
ứng cử viên của ô trên cùng bên trái. Lần này vẫn còn 2 ứng cử viên trong ô này, vì vậy chúng tôi thực sự không tìm thấy một số chính xác mới. Nhưng tuy nhiên việc loại bỏ 1
có thể mở ra cánh cửa cho các chiến lược khác nhau.
Nếu bạn muốn biết thêm thông tin về chiến lược hoặc muốn thêm một vài ví dụ, hãy truy cập sudokuwiki.org .
Thông số kỹ thuật thử thách
Bạn sẽ nhận được 4 danh sách làm đầu vào, đại diện cho các ứng cử viên của các ô. Bốn ô được kết nối giống như một vòng tròn (Ô 1 được kết nối với Ô 2, được kết nối với Ô 3, được kết nối với Ô 4, được kết nối với Ô 1). Bạn có thể giả định rằng mỗi danh sách được sắp xếp theo thứ tự tăng dần.
Công việc của bạn là loại bỏ một ứng cử viên (bằng cách áp dụng chiến lược Y-Wing) và trả về danh sách ứng viên kết quả theo cùng một thứ tự. Nếu bạn không thể áp dụng chiến lược, chỉ cần trả lại danh sách ứng viên tương tự.
Nếu có hai giải pháp khả thi (bạn có thể loại bỏ A của ô B hoặc loại bỏ C của ô D), thì chỉ trả về một giải pháp. Nó không quan trọng cái nào.
Đầu vào có thể ở bất kỳ danh sách gốc hoặc định dạng mảng. Bạn cũng có thể sử dụng một danh sách các danh sách hoặc một cái gì đó tương tự. Bạn có thể nhận đầu vào thông qua STDIN, đối số dòng lệnh, đối số nhắc hoặc hàm và trả về đầu ra thông qua giá trị trả về hoặc đơn giản bằng cách in sang STDOUT.
Đây là môn đánh gôn. Mã ngắn nhất (tính bằng byte) sẽ thắng.
Các trường hợp thử nghiệm
[3 7] [6 7] [2 6] [3 6] => [3 7] [6 7] [2] [3 6] # Example 1
[6 7] [2 6] [3 6] [3 7] => [6 7] [2] [3 6] [3 7] # Example 1, different order
[2 6] [3 6] [3 7] [6 7] => [2] [3 6] [3 7] [6 7] # Example 1, different order
[3 6] [3 7] [6 7] [2 6] => [3 6] [3 7] [6 7] [2] # Example 1, different order
[1 2 8] [1 8] [8 9] [1 9] => [2 8] [1 8] [8 9] [1 9] # Example 2
[3 8] [4 8] [3 4 8] [3 4] => [3 8] [4 8] [3 8] [3 4]
[1 3 6 7 8] [3 8] [3 4] [4 8] => [1 3 6 7] [3 8] [3 4] [4 8]
[7 8] [7 8] [4 7] [4 8] => [7 8] [8] [4 7] [4 8] or [7] [7 8] [4 7] [4 8]
[4 7] [7 8] [4 8] [4] => [4 7] [7 8] [4 8] [] # Fictional example
[3 7] [2 6] [6 7] [3 6] => [3 7] [2 6] [6 7] [3 6] # Y-Wing can't be applied here
[4 7] [2 7 8] [4 8] [1 4] => [4 7] [2 7 8] [4 8] [1 4] # -||-
7 8
là các ứng cử viên cho ô thứ nhất và ô thứ hai. Chiến lược Y-Wing vẫn có thể được áp dụng.