2012-02-15 38 views
5

Tôi đã tạo một thuật toán để tạo sudokus, nhưng nó không hiệu quả lắm. Mỗi câu đố mất vài phút để tạo ra. Vì vậy, bây giờ tôi đang cố gắng viết lại nó một cách tối ưu. Nhưng tôi đang gặp một số vấn đề mà tôi cần trợ giúp.Thuật toán máy phát Sudoku

  1. Có hai chương trình, bắt đầu bằng lưới trống và thêm số, sau đó kiểm tra xem nó có khả năng giải quyết hay không. Cách tiếp cận thứ hai là tạo ra lưới hợp lệ đầy đủ với tất cả 81 số và sau đó loại bỏ cho đến khi chúng tôi hài lòng với số lượng còn lại và vẫn còn khả năng giải.

Trước tiên tôi sử dụng phương pháp tiếp cận đầu tiên nhưng bây giờ tôi sẽ sử dụng thứ hai bởi vì tôi nghĩ rằng đó là hiệu quả hơn (chúng tôi đang bắt đầu với câu đố hợp lệ mà là đảm bảo được khả năng giải quyết). Tôi đúng rằng cách tiếp cận thứ hai là tốt hơn?

  1. Khi tôi cố gắng tạo ra mạng lưới dân cư đầy đủ, tôi đang gặp khó khăn. Thuật toán của tôi là:

    • Đặt ứng cử viên cho từng ô. Khởi tạo chúng là các số từ 1 đến 9.
    • Chọn ô ngẫu nhiên không có giá trị.
    • Chọn ứng cử viên ngẫu nhiên từ ô đó và gán nó làm giá trị ô. Các ứng cử viên khác bị loại bỏ.
    • Bây giờ cho mỗi hàng, tế bào và vuông tương ứng với tế bào phân công tôi loại bỏ giá trị của tế bào từ các ứng cử viên, vì vậy mỗi số là duy nhất trong một hàng/cột/vuông
    • Lặp lại

này kỹ thuật đảm bảo lưới ngẫu nhiên mà không có số trùng lặp. Tuy nhiên, hầu hết thời gian, khi tôi không phá vỡ bất kỳ quy tắc nào của việc sắp đặt một cuộc xung đột - giống như các ô trống, nơi tất cả các ứng cử viên đã bị xóa vv và tôi cần phải bắt đầu lại. Có cách nào thanh lịch/hiệu quả hơn để lấp đầy toàn bộ lưới bằng các con số mà không vi phạm các quy tắc về vị trí và các số ngẫu nhiên không?

Cảm ơn bạn.

Trả lời

0

Nếu bạn đang xem xét một số thuật toán hiện có thì có một dự án C# cho điều đó. Điều đó xuất phát từ cùng một giải pháp như Peter Norvig. Đọc thêm về nó here

Hy vọng điều này sẽ hữu ích!

0

Tôi sử dụng lập trình để xóa tất cả các mục nhập trước xung đột với mục nhập cuối cùng. Với phương pháp này, tôi có thể nhập một số givens và định kỳ lấy một số các giải pháp hoặc nhập toàn bộ lưới điện. Tôi đã không sử dụng mục nhập ngẫu nhiên của toàn bộ lưới vì việc loại bỏ ngẫu nhiên các mục trước có thể dẫn đến thiết lập dài. Đối với mục nhập ngẫu nhiên, tôi hy vọng rằng mục nhập chặn của xung đột sẽ dẫn đến ô trống, vì vậy, câu trả lời có thể là cài đặt dài trong khi xóa các mục nhập xung đột trước đó.Bạn sẽ cần phải quay trở lại tất cả các ô trống cho đến khi không còn ô trống nào. Khi tất cả các ô được lấp đầy, giải pháp phải hợp lệ, nếu không một xung đột sẽ bị xóa.

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