個人專案作業

2022-08-08 23:51:19 字數 4547 閱讀 6128

psp2.1

personal software process stages

預估耗時(分鐘)

實際耗時(分鐘)

planning

計畫30

50estimate

估計這個任務需要多少時間

1015

development

開發analysis

需求分析 (包括學習新技術)

120180

design spec

生成設計文件無無

design review

設計複審 (和同事審核設計文件)無無

coding standard

**規範 (為目前的開發制定合適的規範)無30

design

具體設計

3060

coding

具體編碼

120240

code review

**複審

60120

test

測試(自我測試,修改**,提交修改)

120180

reporting

報告test report

測試報告

3050

size measurement

計算工作量

1020

postmortem & process improvement plan

事後總結, 並提出過程改進計畫

3030

合計560

975開始在看到題目時想到的是通過初始點一直往後延伸推導,後來想了一會感覺有點複雜;在思考無果後通過上網查詢資料了解到生成終局的兩種方法

隨機法,矩陣轉換法;但相比之下感覺矩陣轉換法更加直接,隨機法不確定性加大了難度;而由於第乙個數已經確定為9,因此第一行第一列不能參與變換,這樣通過乙個數獨變換能產生共計5184種;但我們的要求最多有1000000種,因此想產生200個種子數獨,從8個數中取出四位,共有70種取法,而每種取法又對應三種數字交換方式共計210種符合要求,這樣產生的數獨數就已經超過1000000種符合要求了。

在求解數獨上,開始自己思考是想通過那些已確定的那些數字出發,沿著他們所在行列塊進行推導,但隨後感覺有點困難;通過網上查詢感覺方法差不多,相對較為直接的就是回溯法求解了,從最開始點一直遞迴遍歷找到所有存在的可能性,在通過行列和3*3塊的驗證來確定是否符合條件,簡單粗暴,在實現上較為簡單,初始計畫打算就使用了這種方法。
根據思路想到,首先產生的乙個種子出發,首先通過其行列變換最多產生5184個數獨,如果還不足的話從那70種取法中隨機選出先交換數字產生新的種子數獨,然後再行列變換,如此種種,在一定程度上還可以保證隨機性,直到產生夠所要的數獨數即可結束。通過這種思路構建函式也就清晰起來,在數獨產生的函式中通過種子數獨不斷呼叫矩陣變換函式,然後可將矩陣變換函式拆解成行變換函式和列變換函式,如此這樣,函式之間的聯絡清晰明朗,實現起來目標也很明確。總得來說在這一部分產生4個函式,其直接的關係也是層層呼叫。通過這樣的分析對函式的作用了解也清晰許多,通過他們直接的聯絡和他們的用途設計單元測試就比較輕鬆了。

通過暴力解法,對從0到81的所有空白進行1到9的選擇,然後判斷適合符合行列和塊的要求,然後遞迴往下延伸,當後面推不出來遞迴返回繼續延伸推導,直到求解出正確的結果結束。

相對來說這種接法也相對較為直接,從0到81,先填入數字,在判斷是否符合行列和塊的要求,然後遞迴向後延伸。如此這樣分析,相對複雜點的就是遞迴的使用,想都來說3個函式足以。主函式呼叫填空遞迴函式,遞迴函式在填入數字後呼叫檢查函式判斷是否符合行列塊的要求,如此實現。然後相對來說,對遞迴的單元測試也相對有些麻煩,通過從對函式功能的理解出發,結合和其他函式的聯絡設計單元測試會更加全面。

改進:由於產生數獨和求解數獨的最大值已到達1000000,在輸出到檔案和讀取時的效率問題就顯得尤為重要了,因此在這方面花費時間能減就減,因此我就從每次寫入到檔案的數量上做出了改進,再往檔案裡寫入數獨時,我改進到每次寫入兩百個數獨,這樣減少寫入的次數,提高效率。

由中可以看到,呼叫次數最多的為檢查行列塊的合理性函式,這也是暴力求解產生的負面效果,其次在面對檔案操作時話費的時間較多,仍待改善。

主要分做兩個部分,乙個是產生終局數獨,乙個是求解數獨。

這四個為生成終局數獨的四個關鍵函式:

主要就是sudo_create產生種數獨通過呼叫矩陣變換得到擴充套件的數獨,矩陣變換由行變換和列變換組成;

void sudo_create(int sudo_count, char sudo[9][10], char changenum_array[70][5]);		//生成數獨

int matrix_change(int count, int sudo_count, char sudo[9][10], char output[1000000]); //矩陣變換

void line_range(int init, int n, char mid_sudo[9][10], char sudo[9][10]); //行交換

void column_range(int init, int n, char mid_sudo[9][10], char sudo[9][10]); //列變換

其中最為關鍵乙個:產生種子,呼叫擴充套件

void sudo_create(int sudo_count, char sudo[9][10], char changenum_array[70][5]) ;	//是否隨機到識別符號	

char sudo_middle[9][10]; //中間種子數獨

int randnum = 0, i, j;

int count = 0; //已生成的數獨數

char a, b, c, d;

for (i = 0; i<9; i++)

count = matrix_change(count, sudo_count, sudo_middle, output); //根據乙個種子轉換輸出

while (count < sudo_count)

else if (sudo[i][j] == b)

else if (sudo[i][j] == c)

else if (sudo[i][j] == d)

else

sudo_middle[i][j] = sudo[i][j];}}

count = matrix_change(count, sudo_count, sudo_middle, output);

if (count == -1) break;

for (i = 0; i < 9; i++)

else if (sudo[i][j] == b)

else if (sudo[i][j] == c)

else if (sudo[i][j] == d)

else

sudo_middle[i][j] = sudo[i][j];}}

count = matrix_change(count, sudo_count, sudo_middle, output);

if (count == -1) break;

for (i = 0; i < 9; i++)

else if (sudo[i][j] == b)

else if (sudo[i][j] == c)

else if (sudo[i][j] == d)

else

sudo_middle[i][j] = sudo[i][j];}}

count = matrix_change(count, sudo_count, sudo_middle, output);

if (count == -1) break;

} }//cout << output;

}

這三個為求解數獨的主要函式:

主要就是solve_sudo函式呼叫填空進行遞迴,填入乙個數後就判斷其合理性

int solve_sudo(char output, int count);//求解數獨

bool solve_blank(int sudo_num);//填空

bool matrix_judge(int line, int column, int choose);//判斷合理性

關鍵乙個函式:遞迴呼叫,逐步展開

//填數

bool solve_blank(int sudo_num)

sudo1[line][column] = 0;

} }else

return false;

}

個人專案作業

個人專案位址 需求分析 求解數獨 gui設計 可選 如果能夠較好的完成前兩部分再來考慮gui 相關思路 檔案輸入輸出 以下是優化後的cpu使用率s。生成1000,000個數獨終局需要4分10s,雖然還是很慢,但是比最開始已經好了很多。求解1000個數獨花費的時間約為38s,檔案輸入輸出更改後速度也提...

個人專案作業

題目描述 wc 專案要求 wc.exe 是乙個常見的工具,它能統計文字檔案的字元數 單詞數和行數。這個專案要求寫乙個命令列程式,模仿已有wc.exe 的功能,並加以擴充,給出某程式語言原始檔的字元數 單詞數和行數。實現乙個統計程式,它能正確統計程式檔案中的字元數 單詞數 行數,以及還具備其他擴充套件...

個人專案作業

psp2.1 personal software process stages 預估耗時 分鐘 實際耗時 分鐘 planning 計畫 estimate 估計這個任務需要多少時間 440500 development 開發 analysis 需求分析 包括學習新技術 3030 design spec...