Chiến lược cánh Y cho Sudoku


11

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 1hàng 2trong 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 6và 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, 6có 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 đủ.

Ví dụ đầu tiên

Tại sao có thể 6được gỡ bỏ?

Giải trình

Chúng ta hãy giả sử rằng đó 6là số chính xác cho ô thẳng đứng. Bây giờ có một 6cột trong cột này, do đó chúng ta có thể loại bỏ 6khỏ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ỏ 6và đ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 7trong cùng hàng và 3trong cùng một cột, vì vậy chúng ta có thể loại bỏ các 73cá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 Ckhỏi [C D]ô. Nó là rất quan trọng, rằng ba loại tế bào [A B], [A C][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 ( Dcó thể bằng 0, một hoặc thậm chí nhiều ứng cử viên).

Ví dụ với các chữ cái thay vì số

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ỏ 1có thể mở ra cánh cửa cho các chiến lược khác nhau.

Ví dụ thứ hai, không phải trong một hình chữ nhật

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] # -||-

Nhiều bộ trong một đầu vào có thể giống hệt nhau không?
Tối ưu hóa

@Optimizer Có, ví dụ trong trường hợp thử nghiệm thứ 8, 7 8là 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.
Jakube

@Jakube ah được rồi, không thấy thế đâu.
Trình tối ưu hóa

Nếu có nhiều hơn 1 giải pháp, tôi có thể xuất bất kỳ giải pháp nào không?
Trình tối ưu hóa

Vâng, tôi đã làm rõ nó trong câu hỏi.
Jakube

Câu trả lời:


3

CJam, 90 byte

Thật đáng tiếc, điều này quá dài vì hạn chế là 3 ô còn lại chỉ có 2 thí sinh.

l~_:_(a+2/::&_{,}$2>:&:Y;{:PY&Y{P1<}?~}%:X,3>1${,}$W=_,2>\Y&,1?*{X:_(+2/{~:I=}#)_2$=I-t}&p

Điều này dự kiến ​​đầu vào là một danh sách danh sách ở định dạng CJam. Ví dụ:

[[2 6] [3 6] [3 7] [6 7]]

đưa ra đầu ra trong một danh sách định dạng danh sách của CJam:

[[2] [3 6] [3 7] [6 7]]

Sẽ thêm lời giải thích khi tôi chơi golf xong ..

Dùng thử trực tuyến tại đây hoặc thử toàn bộ bộ thử nghiệm tại đây .


3

Toán học, 124 110 byte

Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])&

Ví dụ:

In[1]:= yWing = Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])& ;

In[2]:= yWing[{{3, 7}, {6, 7}, {2, 6}, {3, 6}}]

Out[2]= {{3, 7}, {6, 7}, {2}, {3, 6}}

In[3]:= yWing[{{4, 7}, {7, 8}, {4, 8}, {4}}]

Out[3]= {{4, 7}, {7, 8}, {4, 8}, {}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.