使用matlab生成数独(无回溯法)
使用matlab生成數獨
常見生成數獨程序
常見的數獨生成方法是首先產生一張完整的9宮數字圖,然后隨機挖掉一些數字,產生數獨。也就是說要產生數獨,首先產生答案。
本人在開始寫程序前想在csdn中尋找一些經驗,奈何多數大神都是用java和c++寫的,而且數學思想都是使用回溯法,回溯法的核心思想為:
1·在一格內隨機填入1~9內的一個數,并按照數獨規則判斷此時這個數是否合適。
2·若合適,則繼續填寫下一格的數字。
3·若1~9都不合適,也返回上一格,修改其中數字,然后再次嘗試填入數字。
4·不斷循環,直到81格全部填入數字。
按各位大神的文章來說,這種方法的效率感人,可是我對遞歸的理解不深,java和c++的基礎也比較薄弱,完全看不懂大神的程序,也就無法判斷效率到底有多感人。
除此以外還有一些其他思路,比如用0-1規劃,約束問題,可是這些方法我連數學原理都沒看懂,更不用說程序。
那不用回溯法就不能寫數獨了嗎?當然不是的,不然我也不會來寫博客。
我的數獨產生方法
我的數獨產生思想為:
1·首先產生1~9的隨機數列,填入九宮圖第一行。(此時整個圖都是空的,所以一定不會有問題)
2·從第二行第一列開始,在每一格填數前,首先取出此格所在行,所在列,所在宮,已經填入的所有數,判斷在1~9中還有哪些數可以填,這些數稱為備選數。隨機從備選數中選擇一個填入此格。
3·不斷循環,填入其余72個格。
這種方法乍一聽好像可行,按這種思想寫出以下程序:
但實際運行以后生成的大部分都是這種矩陣:
A =
顯然第五行中還缺少3,可是在第8列和第9列中都已經填入了3,這時就出現矛盾了,無法繼續進行下去。
但是所有數獨答案都滿足我上述的思想,而且在我多次運行這段程序時確實輸出了一個正確的數獨矩陣。也就是說只要多次循環這段程序就可以產生數獨,只是循環次數不固定。但是對于計算機來說,這種循環還是很快的,所以我改進了程序如下:
那這種方法的效率怎么樣呢?我使用這段程序一次生成過800個數獨答案,取得循環次數的平均值是49次,對于電腦來說不到一秒鐘,最多的一次循環了一千四百多次,大約是5~6秒的時間,最短的一次只循環了兩次,這個時間也不知道和回溯法比起來怎么樣。
隨機挖空比較容易,代碼如下:
優缺點分析
產生答案部分最大的優點就是代碼長度很短,便于理解,不需要用到遞歸這樣的高級程序手段,我看其他人的代碼長度基本都在一百五十行左右。缺點就在于產生一個答案的時間不固定,且差距較大。
主要缺點集中在產生數獨部分,這種方法產生的數獨只能保證有解,但并不能保證有唯一解。而且數獨的難度并不是僅在每行缺少的數字個數,而重點在于每個空格的備選數是否唯一,每行缺少4個數字可能會比每行缺少6個數字更難。
一點小期待
這是我第一次在csdn寫博客,還有很多不足之處,功能使用也不是很熟練,希望各位能提出意見,無論是在程序方面,還是在博客文案,排版方面,歡迎交流,感激不盡。
我也在嘗試寫解數獨的程序,但是目前還不完善,如果把每行缺少3個數稱為3級難度,那我現有的成果是,3級難度成功率為100%,4級難度成功率為98.5%,5級難度成功率為78%,6級難度成功率為17.8%,希望未來我可以將其完善。
總結
以上是生活随笔為你收集整理的使用matlab生成数独(无回溯法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上传任意文件或者上传漏洞
- 下一篇: 直流电机选型过程