2012-03-01 35 views
8

Tôi đã xem qua câu đố nghiêng trong Ubuntu. tôi muốn giải quyết các câu đố logic và không bằng thử và sai, vvLàm thế nào để giải quyết câu đố này một cách hợp lý mà không cần dùng thử và lỗi

Các quy tắc rất đơn giản:

  1. Chúng ta phải điền vào tất cả các hộp với quyền hoặc nghiêng trái.
  2. Số lượng số lần chạm vào một số phải bằng với số đó.
  3. Không có vòng lặp nào được phép trong bảng. tức là các slants không được tạo thành vòng lặp.

Puzzle:

Question

Auto giải quyết câu trả lời:

enter image description here

để tôi bắt đầu từ đâu?

+0

Chắc chắn, bạn sẽ cần một số lượng dùng thử và lỗi. Bạn có thể loại trừ một số tùy chọn sớm, nhưng tôi không nghĩ rằng điều này có thể được thực hiện mà không có bất kỳ backtracking. –

+1

@EAGER_STUDENT: Tôi lấy nó có nghĩa là [trò chơi này] (http://manpages.ubuntu.com/manpages/lucid/man6/slant.6.html)? Bạn không thể xem mã nguồn để xem cách họ giải quyết nó? – James

+0

@AakashM có Tôi có thể giải quyết các lưới đơn giản một cách hợp lý. Trong lưới đơn giản sẽ có số như 0 hoặc 4 hoặc 1 ở góc. Với điều này như một công cụ tôi sẽ giải quyết. Khi chiều rộng hoặc chiều cao tăng vấn đề là 3 điều này không có mặt trong các câu đố khó hơn. –

Trả lời

2

Thay vì nghiêng trái và phải, tôi sẽ sử dụng dấu gạch chéo (/) và dấu gạch chéo ngược (\).

Hãy lấy một hình vuông có các góc (x1) (11), trong đó x là bất kỳ thông tin nào, nhưng 1. Có một hình vuông ở góc trên cùng bên trái. Giả sử rằng nghiêng trên hình vuông đó là dấu gạch chéo, kết nối hai của 1. Những người 1 được "sử dụng hết" và tất cả các ô vuông chạm vào chúng phải có các đường không chạm vào các con số. Nhưng điều đó dẫn đến tình huống không thể xảy ra bởi vì chúng tôi sẽ có một dấu gạch chéo cả bên trái và bên dưới hình vuông của chúng tôi có nghĩa là số còn lại 1 đang chạm vào hai slants. Kết luận: nếu bạn có một hình vuông có ba 1 thì đường thẳng trong ô vuông đó phải chạm vào góc không phải là. Quy tắc này có thể không áp dụng ở các cạnh và góc, nhưng nếu bạn có 1 ở góc, bạn phải vẽ đường chạm vào góc đó.

Số 1 và 3 là đối xứng và sử dụng logic tương tự, chúng tôi nhận được một quy tắc khác: nếu bạn có hình vuông có ba 3 thì đường thẳng trong ô đó phải chạm vào hai trong số 32 của ba 3.

Có nhiều quy tắc chung hơn, nhưng chúng không áp dụng ở các góc. Phải có hình vuông xung quanh hình vuông được đề cập. Hãy lấy một hình vuông hai đối số 1 (x1) (1y), trong đó x và y là bất cứ thứ gì, bao gồm cả số không. Có hai ô vuông cách xa góc dưới bên trái.Giả sử rằng nghiêng trên hình vuông đó là dấu gạch chéo, kết nối hai của 1. Những người 1 được "sử dụng hết" và tất cả các ô vuông chạm vào chúng phải có các đường không chạm vào các con số. Nhưng điều đó dẫn đến vòng lặp xung quanh của 1. Kết luận: nếu bạn có một hình vuông với hai đối diện 1 thì đường thẳng trong ô vuông đó không được chạm vào hai số của hai số 1 đó. Quy tắc này có thể không áp dụng trên các cạnh của bảng.

Số 1 và 3 là đối xứng, nhưng quy tắc trước sử dụng quy tắc "không có vòng" và không có quy tắc "không có vòng đường bên" đối xứng và do đó không có quy tắc nào có hai đối số 3.

Bây giờ bạn biết dòng nào chạm vào số 1, bạn có thể kết luận rằng không có dòng nào khác có thể chạm vào nó. Chúng ta có thể khái quát hóa lý do sau khi điền các quy tắc: nếu một số x chạm vào x dòng thì tất cả các ô vuông lân cận khác có các dòng không chạm vào số. Và đối xứng: nếu một số x là góc của ô vuông (4 x) với các dòng không chạm vào số thì tất cả các ô vuông lân cận khác phải có các dòng chạm vào số.

Googling xung quanh cho cụm từ "Gokigen Naname" Tôi tìm thấy nhiều quy tắc hơn. Một là khoảng hai lân cận 1 (11), nhưng Mweerden đã bao phủ nó.

Các quy tắc này không đủ để giải quyết bảng. Có thể có những quy tắc khác. Nhưng cuối cùng thuật toán có thể phải đoán.

+0

Tôi không tin rằng trong bất kỳ câu đố hay nào, thuật toán sẽ phải đoán (dựa trên số lượng kinh nghiệm hợp lý để chơi phiên bản từ bộ sưu tập câu đố di động của Simon Tatham - http://www.chiark.greenend.org.uk /~sgtatham/puzzles/java/slant.html) nhưng nếu không tôi đồng ý. Tất cả về việc tìm kiếm các mẫu cung cấp cho bạn thông tin và sau đó thêm thông tin vào và sau đó tìm thêm các mẫu. Nếu bạn đang dự đoán thì bạn sẽ không có đủ mẫu. :) – Chris

+0

Số lượng các mẫu có thể lớn đến nỗi sẽ tốt hơn để đoán hơn là có một cơ sở dữ liệu lớn gigabyte. – Dialecticus

+0

Bạn nói đúng rằng có những lúc chỉ thử nghiệm một con đường cho thất bại có thể là tốt nhất nhưng trực giác/kinh nghiệm của tôi cho thấy rằng đây không phải là trường hợp. Nó đã quá lâu kể từ lần cuối tôi chơi mặc dù vậy tôi không thể nhớ tất cả các quy tắc tôi có trong đầu để sử dụng và đặt xuống đây. Nếu tôi không làm việc, tôi sẽ bắt đầu chơi để nhắc nhở bản thân mình. ;-) – Chris

2

"Hợp lý" là một thuật ngữ rất rộng. Như Orbling đã đề cập trong các ý kiến, backtracking có thể được coi là hợp lý. Người ta cũng có thể hiểu "hợp lý" như ý nghĩa làm thế nào để giải quyết nó bằng cách dịch nó thành một công thức logic. Từ những bình luận tôi thu thập, bạn đang cố gắng thực hiện một người giải quyết, tương tự như một người giải Sudoku phổ biến.

Cách đơn giản để triển khai trình giải quyết, tương tự như một giải pháp cho Sudokus, là tìm các mẫu nhất định. Đối với các câu đố được tạo ra bởi chương trình bạn đề cập đến, tôi có thể nói với sự tự tin hợp lý rằng điều này là đủ để giải quyết chúng mà không cần đoán và quay lại.

Một số ví dụ về các mẫu hiển nhiên là <11>>33<. Đặc biệt 2 có một số thuộc tính "transitive" đẹp. Ví dụ: <12...23 -> <12...23< (với 2 ... 2 số lượng tùy ý là 2 giây). Hãy thử giải quyết của bạn trên các ví dụ khác nhau và khi nó bị mắc kẹt Tôi chắc rằng bạn đã tìm thấy một ví dụ có thể dạy cho bạn một mô hình khác.

Các vấn đề liên quan