Làm cách nào để tạo câu đố Sudoku?


17

Tôi đang cố gắng tạo ra một trình tạo câu đố Sudoku. Nó khó hơn tôi mong đợi rất nhiều và tôi càng tham gia vào nó, nó càng khó hơn!

Cách tiếp cận hiện tại của tôi là chia vấn đề thành 2 bước:

  1. Tạo một câu đố Sudoku hoàn chỉnh (đã giải).
  2. Xóa số cho đến khi nó có thể giải quyết được và chỉ có 1 giải pháp.

Ở bước 1, vì tôi đang sử dụng các phương pháp vũ phu, tôi phải đối mặt với một số vấn đề về thời gian. Có cách nào tối ưu để điền vào một câu đố Sudoku hoàn chỉnh không?

Trong bước 2, tôi nên sử dụng loại thuật toán nào để "đánh đố" một sudoku đã giải?


câu hỏi này có một số thông tin bạn có thể trích xuất trong cách tạo câu đố
ratchet freak

3
Câu hỏi này cũng đã được hỏi trên Puzzling (và có câu trả lời tốt hơn ở đó): puzzling.stackexchange.com/questions/142/
Kẻ

Câu trả lời:


30

Tôi có một trò chơi Sudoku bán chạy nhất trên cửa hàng ứng dụng iOS. Đây là cách tôi tạo ra các câu đố.

Đầu tiên tôi có một ứng dụng tạo câu đố. Nhưng nó không phải là một phần của mã trò chơi. Đây là một ứng dụng độc lập mà tôi sử dụng để tạo câu đố. Nó được sửa đổi cao để tôi có thể thiết lập nó để tạo các kiểu mẫu khác nhau, xếp hạng độ khó, số lượng quà tặng, v.v. Tạo câu đố và nhận mức độ khó nhất quán rất khó thực hiện và mất nhiều thời gian hơn người chơi muốn chờ. Vì vậy, tôi tạo ra cái mà tôi gọi là "câu đố hạt giống" và đó là những gì được sử dụng bởi mã của trò chơi để tạo ra các câu đố mà mọi người chơi.

Tôi không trả lời làm thế nào để mã hóa một trình tạo ở đây. Bạn có thể google và tìm hàng tấn mã trình tạo câu đố trực tuyến. Bắt đầu từ đó Nhưng để làm nên một game hay, bạn cần tạo ra một game hay. Trò chơi của tôi không tạo ra các câu đố khi đang bay.

Cách ứng dụng trình tạo câu đố của tôi hoạt động là nó tạo ra hàng ngàn câu đố mỗi phút, nhưng chúng không tốt và tất cả chúng đều không phù hợp với mức độ khó cụ thể. Trình tạo sẽ tạo ra một câu đố, sau đó giải nó và tìm ra một mức độ khó và đánh giá câu đố dựa trên các kỹ thuật cần thiết để giải câu đố và xác định xem có cần phải đoán để giải nó không (thường là xấu). Nó ném ra bất kỳ câu đố không phù hợp với một tiêu chí. Đối với các câu đố khó nhưng không phải là không thể, trên một máy nhanh, có thể mất một giờ để tạo ra 100 câu đố phù hợp với thông số kỹ thuật chính xác của tôi. Đây là lý do tại sao tôi không làm điều này trong ứng dụng. Tạo các câu đố nhanh chóng với các thông số kỹ thuật khó khăn đó sẽ không hoạt động cho chất lượng của các câu đố mà tôi có trong ứng dụng của mình.

Các câu đố là các chuỗi, dài 162 ký tự, 81 ký tự có số và dấu gạch ngang hoặc dấu chấm nơi các khoảng trống sẽ xuất hiện, sau đó là 81 ký tự khác với lời giải. Sau đó, các cột cho từng chỉ số, như có bao nhiêu đơn, đôi, v.v.

Đầu ra của tôi từ tất cả các phiên tạo là các dòng được phân cách bằng dấu phẩy với các số liệu thống kê dưới dạng cột. Tôi có thể mất 10.000 câu đố, đưa chúng vào excel và sắp xếp chúng theo độ khó. Sau đó đưa chúng vào một ứng dụng để xem chúng trên bảng trò chơi. Tôi cũng nhìn vào chúng để thu hút thị giác và các mẫu có thể nhìn thấy cho câu đố. Sau đó tôi tự tay chọn từ những thứ đó.

Tôi gọi chúng là những câu đố hạt giống và đây là những gì tôi muốn nói. Những con số trong một trò chơi sudoku thực sự chỉ là mã thông báo. Thay vì là các số 1-9, chúng có thể là màu sắc hoặc ký hiệu hoặc chữ cái. Vì vậy, câu đố hạt giống của tôi không phải là số họ là những chữ cái ai. Mỗi câu đố hạt giống được thay đổi nhanh chóng để tạo ra một câu đố có thể chơi được:

  1. Chọn ngẫu nhiên các số / mã thông báo. Khi tôi biến các chữ cái trở lại thành các số 1-9, bảng tra cứu được chọn ngẫu nhiên. Có nghĩa là không phải lúc nào cũng 1. Điều đó một mình tạo ra khoảng 300.000 biến thể trên mỗi câu đố.
  2. Xoay câu đố 90, 180 hoặc 270 độ. Điều đó thêm 4 biến thể.
  3. Lật câu đố theo chiều ngang, chiều dọc hoặc cả hai. Điều đó thêm 4 biến thể.

Mỗi câu đố hạt giống do đó có thể tạo ra 5.806.080 biến thể. Tôi đã thử nghiệm điều này trong lĩnh vực này với những người chơi thực sự. Mọi người không biết rằng về cơ bản họ đang chơi cùng một câu đố. Thật sự là không thể. Chỉ khi họ nhận thấy rằng mẫu của các givens giống nhau mỗi lần. Nhưng với 100 hạt giống khác nhau, sẽ không có ai chú ý. Một triệu người dùng trò chơi của tôi chưa. Tôi cũng đã thử nó với các ứng dụng giải. Một ứng dụng giải sẽ không giải được câu đố theo cách tương tự khi nó bị xoay hoặc lật. Nó thậm chí đôi khi sẽ phân tích nó như một đánh giá độ khó khác nhau mặc dù về mặt kỹ thuật đó là cùng một câu đố.

Tuy nhiên, Big Bad Sudoku Book có 10 trong số 1000 câu đố hạt giống ở 5 cấp độ khó và nhiều kiểu câu đố. Điều này có nghĩa là có hàng tỷ câu đố trong trò chơi của tôi. Với mỗi 10.000 câu đố hạt giống, có 58.060.800.000 câu đố khác nhau.

Trong Sudoku Book phiên bản 4 (dự kiến ​​ra mắt năm 2016), tôi đã tìm ra một cách để có thể chỉ định một câu đố chính xác trong số 58 tỷ đó và có được câu đố tương tự trên mỗi thiết bị của người chơi.


Bài viết rất hữu ích. Bạn có kiểm tra xem hạt giống mà bạn tạo ra có thể được tạo ra từ những hạt giống khác không, có nghĩa là bạn có hạt giống nhau không?
VLAS

Đúng. Tôi thả tất cả trong textmate và làm một loại. Sau đó loại bỏ trùng lặp. Tôi không nghĩ rằng nó đã bao giờ loại bỏ bất kỳ. Hạt giống hoàn toàn độc đáo. Không thể tạo ra cùng một câu đố từ hai hạt giống khác nhau. Một ngày nào đó tôi sẽ chỉ ra quy trình chính xác nhưng không phải bây giờ khi tôi vẫn thu được lợi nhuận từ các phương pháp của mình. :)
badweasel 5/2/2016

Trên thực tế toàn bộ quá trình của tôi là khá nhiều ở đây.
badweasel

2
+1 cho cái nhìn sâu sắc rằng các số chỉ là mã thông báo và cách bạn có thể thực hiện các biến thể chỉ là thay đổi các số được gán cho các chữ cái.
S. Mitchell

Câu trả lời thực sự hữu ích! Vì bạn có 3 cột và 3 hàng, nên bạn có thể di chuyển cột giữa sang trái hoặc phải và hàng giữa đến trên cùng hoặc dưới cùng để tạo thêm 4 biến thể. Và thay vì lật câu đố theo chiều dọc hoặc lật nó theo chiều ngang, bạn chỉ có thể trao đổi các cột bên trái và bên phải (và các hàng trên cùng và dưới cùng) để có thêm 4 biến thể. Vì vậy, tôi nghĩ rằng bạn phải nhận được 43 triệu biến thể từ một hạt giống.
Roger_S

4

Ở bước (1) Tạo câu đố Sudoku hoàn chỉnh (đã giải), vì tôi đang sử dụng phương pháp vũ phu, tôi đang đối mặt với một số vấn đề về thời gian chạy. Có cách nào tối ưu để điền vào một câu đố Sudoku hoàn chỉnh không?

Có một cách dễ dàng để điền vào một câu đố Sudoku hoàn chỉnh - điền vào nhóm và thay đổi vòng tròn.

  1. Điền vào hàng đầu tiên với chín số khác nhau.
  2. Điền vào hàng thứ hai là một sự thay đổi của dòng đầu tiên bằng ba vị trí.
  3. Lấp đầy hàng thứ ba là một sự thay đổi của dòng thứ hai bằng ba vị trí.
  4. Điền vào hàng thứ tư là một sự thay đổi của thứ ba bởi một khe.


line 1: 8 9 3  2 7 6  4 5 1
line 2: 2 7 6  4 5 1  8 9 3 (shift 3)
line 3: 4 5 1  8 9 3  2 7 6 (shift 3)

line 4: 5 1 8  9 3 2  7 6 4 (shift 1)
line 5: 9 3 2  7 6 4  5 1 8 (shift 3)
line 6: 7 6 4  5 1 8  9 3 2 (shift 3)

line 7: 6 4 5  1 8 9  3 2 7 (shift 1)
line 8: 1 8 9  3 2 7  6 4 5 (shift 3)
line 9: 3 2 7  6 4 5  1 8 9 (shift 3)

Để ngăn người dùng nhận thấy mẫu rõ ràng, có thể là một ý tưởng tốt để chọn ngẫu nhiên thứ tự của các hàng và các cột để không còn mẫu nào nữa. Miễn là tất cả 9 số trong mỗi hàng / cột di chuyển cùng nhau thành một đơn vị nguyên tử, bảng Sudoku sẽ luôn duy trì hiệu lực.

Bạn nhận được một câu đố Sudoku đầy đủ. Để biết thêm chi tiết, bạn có thể tìm kiếm "tạo Sudoku".


3

Điều đó không quá khó, với điều kiện bạn phải có người giải sudoku.

Làm bộ giải sudoku là một vấn đề khó / thú vị, vì vậy tốt nhất bạn nên lưu nó cho một câu hỏi khác. Hoặc bạn chỉ có thể đọc và xem cách bạn đi.

  1. Để tạo ra một câu đố đã giải, chỉ cần chạy bộ giải trên một bảng trống. Nhắc nhở duy nhất là bạn nên chọn ngẫu nhiên các "dự đoán" mà người giải sử dụng, nếu không bạn có thể kết thúc với cùng một câu đố mỗi lần. Đó là, tại một số điểm, người giải sẽ thử một số cho một ô; nó có thể thử theo thứ tự này: 1, 2, 3, 4, ...và chọn cái đầu tiên hoạt động. Bạn cần xáo trộn thứ tự đó để nó cố gắng, nói , 4, 7, 2, 9, .... Quá trình này phải nhanh như người giải quyết của bạn.
  2. Để xóa số, sử dụng thuật toán này:
    • Chọn một số ngẫu nhiên bạn chưa thử xóa trước đó
    • Xóa số, chạy bộ giải của bạn với điều kiện được thêm vào mà nó không thể sử dụng số đã xóa ở đây
    • Nếu người giải tìm được lời giải, bạn không thể xóa số
    • Lặp lại, cho đến khi bạn đã xóa đủ số lượng (hoặc bạn không thể xóa thêm nữa)

Đây là một phương pháp rất đơn giản (và ngây thơ), vì vậy không có gì đảm bảo rằng bạn sẽ gặp phải những câu đố về một khó khăn nhất định - ngoài số lượng số còn thiếu - hoặc thậm chí nếu bạn có thể loại bỏ số lượng bạn muốn. Hy vọng điều này sẽ giúp dù sao.


Hãy chắc chắn rằng người giải không thể tìm thấy nhiều giải pháp từ cùng một trạng thái. Thông thường chỉ nên có một giải pháp. Ngoài ra, bạn có thể kiểm tra các bước logic nào mà người giải cần thực hiện để tìm giải pháp xác định độ khó, ví dụ: có cần sử dụng chiến lược x-wing hay ...?
OriginalDaemon

1
@OrigenDaemon liên quan đến điểm đầu tiên của bạn, nó được bao phủ trong điểm chấm thứ ba: nếu xóa số đó dẫn đến giải pháp thứ hai, hãy quay lại.
congusbongus

0

Tôi chỉ nghĩ rằng thật thú vị khi chỉ ra trang web này , vì nó đã giúp tôi rất nhiều cho sự phát triển proyect của chúng tôi. Làm một sudoku với một giải pháp độc đáo khác xa với một nhiệm vụ đơn giản. Trong liên kết, bạn có thể tìm thấy cách tác giả (anh ấy thực sự đã làm một công việc tuyệt vời, đó không phải là tôi!), Đã tìm thấy một số chiến lược khác nhau. Bạn có thể có một ý tưởng để tạo bộ giải Sudoku của riêng bạn.

Bây giờ, đi với chủ đề, cũng có một cách để tạo ra sudokus tương tự, chỉ bằng cách

  1. Hoán vị của các hàng.
  2. Một giải pháp đơn giản khác, là bắt đầu với một sudoku điền vào minimun 17 chữ số điền vào (tối thiểu đã được chứng minh để tìm một giải pháp duy nhất) và điền vào các chiến lược khác nhau (ví dụ: trong liên kết trước đó, các chiến lược được chia cho những khó khăn, bạn có thể làm một cái gì đó tương tự), cho đến khi bạn đạt được giải pháp duy nhất.
  3. Có một danh sách của một nhà toán học đang cố gắng tìm một sudoku giải pháp duy nhất gồm 16 chữ số bắt đầu, với một danh sách HUGEEEEEE gồm 17 chữ số sudokus. Tôi không thể nhớ nếu anh ta có bất kỳ loại bản sao viết nào, nhưng tôi khá chắc chắn, nếu bạn có thể cung cấp cho anh ta 17 giải pháp độc đáo khác, sudoku sẽ rất vui lòng cho phép bạn sử dụng dữ liệu của anh ta.

Chúc mừng và chúc may mắn với thuật toán: D


Hmm, liên kết là dành cho người giải sudoku, không phải máy phát.
greenoldman

@greenoldman CÓ, NÓ LÀ MỘT GIẢI PHÁP. Tôi nghĩ rằng nó thú vị cho người dùng vì anh ấy là phương pháp hiện tại để loại bỏ một số và giải quyết. Liên kết đưa ra các chiến lược để giải quyết nhanh hơn anh ta là một phần của sudoku
David Sánchez

0

Người giải quyết của tôi đang sử dụng vũ lực, và có thể tìm ra giải pháp trong vòng 20 mili giây. Bằng cách sử dụng phương pháp xóa, được mô tả ở trên, trình tạo của tôi tạo ra một câu đố trong vòng 200 mili giây.

Nó thường tạo ra một câu đố với khoảng 24-34 chữ số còn lại và tôi vẫn không biết làm thế nào trên thế giới họ quản lý để tạo ra câu đố 17 chữ số.

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.