軟體工程基礎 個人專案報告之生成數獨終局

2021-10-02 04:08:57 字數 3692 閱讀 6486

專案位址

1、個人專案報告之可行性分析、需求分析、概要設計:

2、個人專案報告之生成數獨終局:

3、個人專案報告之生成終局**優化:

4、個人專案報告之求解數獨:

5、個人專案報告之求解**優化:

6、個人專案報告之生成數獨題目:

7、個人專案報告之單元測試及分支覆蓋率:

解題思路

首先,我們應該明確一點的是,9*9數獨中的每一行、每一列及每一宮都必須無重複的出現0-9的每乙個數字。生成數獨終局,很容易想到的是全排列,因為數獨中的每一行數字序列都是數字0-9排列的一種,因此每一行的數字的排列方式一定是9!中的一種。當然由於題目條件的限制(第一行第乙個數是固定的),數獨第一行的數字是8!中的一種。但需要注意的是,數獨遊戲的限制要求每一列及每一宮也不能出現0-9中的重複數字,這在考慮能夠生成的終局的總數方面是十分重要的一點。至於如何生成數獨終局,我想到的是通過第一行數字平移特定位數來生成其他行數的方法,如何滿足列、宮上的限制,具體操作如下:

最開始映入腦海中的想法是,第二行通過第一行移動一位來產生,第三行通過第一行移動兩位來產生……這個想法顯然不行,因為它只滿足了行和列的要求,並沒有滿足每一宮中的要求。那麼既然每次移動一位不行,那我每三行劃分成一組,然後通過三列三列的移動,是否有效?在進行驗證之前我先簡單的闡述一下具體的過程。方便起見,我們先用陣列a[1]-a[9]表示第一行的數。第二行通過第一行移動三位得到,第三行通過第二行移動三位得到,那麼第四行呢?因為第四行中沒有和第一行的數處於同一宮的可能,只需滿足行與列上的關係,所以只需要按照最開始的想法通過第一行移動一位即可!然後4~6行按照1~3行的變換獲取。第7行再利用第4行右移一位獲得然後同樣按照1~3行的變換生成7~9行的變換即可完成整個數獨的生成。

a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

a[4]a[5]a[6]a[7]a[8]a[9]a[1]a[2]a[3]

a[7]a[8]a[9]a[1]a[2]a[3]a[4]a[5]a[6]

a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[1]

a[5]a[6]a[7]a[8]a[9]a[1]a[2]a[3]a[4]

a[8]a[9]a[1]a[2]a[3]a[4]a[5]a[6]a[7]

a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[1]a[2]

a[6]a[7]a[8]a[9]a[1]a[2]a[3]a[4]a[5]

a[9]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]

可以看到,這樣生成的數獨矩陣是滿足每一行、每一列及每一宮無重複出現a[1]~a[9]中每個數的條件。因此,按照這種生成數獨的話,一共能生成8!個(第一行第一位固定為4)有效的數獨。但8!=40320<1e6,不及題目要求的數量。但仔細思考後我發現,對於每個數獨終局來說,交換2、3行,交換4、5、6行,或者交換7、8、9行的資料便可以生成新的資料終局(不用管具體的數,只需要觀察上面的「代號」陣列a[1]-a[9]即可)。這樣終局生成總數就來到了8!*2*3!*3!=2903040種結果,這也就意味著1e6的條件能夠滿足。

**實現

最初的**實現中,並沒有考慮到效能方面的問題,只是初步的解決了如何實現。如同上面的問題分析所述,實現過程中最為重要的部分在生成各行根據第一行的變換的位移量,而位移量的總個數等於2*6*6個。在實現過程中我有考慮將所有的可能性儲存起來然後要用的時候直接查詢,但最終考慮到1.0版本完成之後還要進行優化,就放棄了這個念頭,而是選擇邊生數獨終局成邊進行位移量的生成。

在此基礎之上,我先將2、3行,4、5、6行,7、8、9行的各行的變換單獨儲存起來,然後再將它們組合在一起,**中具體用到的函式是changemap函式。 三個單獨存放起來的變換:

int rule_1[2] = ;

int rule_2[6] = ;

int rule_3[6] = ;

得到變規則之後,對於單獨一行來說,每一列數字的位移量都是一樣的,然後只需要將第一行的每乙個數字都移上相應的位數,就能夠實現數獨終局的生成。

for (int row = 0; row < 9; row++)

out << endl;

}

直到這裡,生成數獨終局的1.0版本其實大體功能已經實現了,剩下的額是一些格式的問題。其實從**中也可以看的出來,初始版本的**效率肯定差強人意,畢竟乙個數字乙個數字的輸出到檔案中,一定會耗費大量的時間。所以效能的優化是在所難免的。

軟體工程基礎 個人專案報告之生成數獨題目

專案位址 1 個人專案報告之可行性分析 需求分析 概要設計 2 個人專案報告之生成數獨終局 3 個人專案報告之生成終局 優化 4 個人專案報告之求解數獨 5 個人專案報告之求解 優化 6 個人專案報告之生成數獨題目 7 個人專案報告之單元測試及分支覆蓋率 從整個個人專案來看,生成數獨題目的部分似乎是...

軟體工程基礎 個人專案報告之求解數獨

專案位址 1 個人專案報告之可行性分析 需求分析 概要設計 2 個人專案報告之生成數獨終局 3 個人專案報告之生成終局 優化 4 個人專案報告之求解數獨 5 個人專案報告之求解 優化 6 個人專案報告之生成數獨題目 7 個人專案報告之單元測試及分支覆蓋率 解題思路 按照平時玩數獨的習慣,當然只是針對...

軟體工程個人報告

在本學期中,軟體工程由我們敬愛的 親愛的 有責任心的王老師教我們。該課程採用全過程考核機制,從頭到尾,從第一周到最後一周,每一周都有不同的任務,每一周也要有不同的總結,讓我們一直在緊張而又豐富的學習生活中。在這整個學期中,我們的精力精神,都完全被 軟體工程 這門課所深深的吸引著,王老師明燈似的指引著...