軟工第三次做業

github地址

https://github.com/kevintrey/081700537.gitgit

PSP表格

Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
計劃 20 30
估計這個任務須要多少時間 360 480
開發 240 360
需求分析 (包括學習新技術) 240 240
生成設計文檔 10 10
設計複審 30 40
代碼規範 (爲目前的開發制定合適的規範) 5 5
具體設計 20 30
具體編碼 240 360
代碼複審 60 60
測試(自我測試,修改代碼,提交修改) 60 120
報告 20 20
測試報告 30 30
計算工做量 20 10
過後總結, 並提出過程改進計劃 20 15

解題思路描述

剛拿到題目,第一次接觸到數獨,首先經過百度百科瞭解數獨的規則,再經過一些數獨遊戲本身玩了幾個簡單的數獨,再在博客上看一些關於設計程序解數獨的思路,最終選定用深度搜索的方法來構建數獨。題目還設計到文件輸入輸出和命令行參數,經過閱讀一些博客找回文件輸入輸出的知識,以及新學習了命令行傳參。

算法關鍵,所運用的函數,單元測試的設計

算法關鍵在於用深度搜索構造數獨,函數分別用到了input()輸入函數,output()輸出函數,DFS()深搜,Check()判別是否合法的函數。首先經過input函數將宮格大小,盤面等信息輸入,接下來由DFS()構造數獨,用遞歸的方法,經過深度搜索測試每一個點的每一個可能,只要行不通就回溯到最初的點上,DFS()內會用到Check()來判別該點是否合法,最後再用output函數輸出到文本output.txt。測試input函數和output函數的時候,在input.txt文件中寫入一個數獨盤,先無論是否構造完數獨,直接用output函數,在檢測output.txt文件中是否輸出了數獨盤。測試check函數時,編寫了一小段代碼若返回true則輸出1,反之則輸出0,用多個例子測試來完善函數,最後測試DFS時,與前面幾個已經肯定正確函數配合測試。

程序性能的改進

暫時沒有想到改進程序的方法

關鍵代碼展現

/* 判斷key填入n時是否知足條件 /
bool Check(int n, int key,int c)
{
/
判斷n所在橫列是否合法 /
for (int i = 0; i < c; i++)
{
/
j爲n豎座標 */
int j = n / c;
if (num[j][i] == key) return false;
}github

/* 判斷n所在豎列是否合法 */
for (int i = 0; i < c; i++)
{
    /* j爲n橫座標 */
    int j = n % c;
    if (num[i][j] == key) return false;
}
if(c>3)
{
/* x爲n所在的小九宮格左頂點豎座標 */
int x = n / 9 / 3 * 3;

/* y爲n所在的小九宮格左頂點橫座標 */
int y = n % 9 / 3 * 3;

/* 判斷n所在的小九宮格是否合法 */
for (int i = x; i < x + 3; i++)
{
    for (int j = y; j < y + 3; j++)
    {
        if (num[i][j] == key) return false;
    }
}

}算法

/* 所有合法,返回正確 */
return true;

}函數

/* 深搜構造數獨 /
int DFS(int n,int d)
{
/
全部的都符合,退出遞歸 /
if (n > d
d-1)
{
sign = true;
return 0;
}
/* 當前位不爲空時跳過 /
if (num[n/d][n%d] != 0)
{
DFS(n+1,d);
}
else
{
/
不然對當前位進行枚舉測試 /
for (int i = 1; i <= d; i++)
{
/
知足條件時填入數字 /
if (Check(n, i,d) == true)
{
num[n/d][n%d] = i;
/
繼續搜索 /
DFS(n+1,d);
/
返回時若是構形成功,則直接退出 /
if (sign == true) return 0;
/
若是構造不成功,還原當前位 */
num[n/d][n%d] = 0;
}
}
}
}性能

心路歷程

經過閱讀構造之法,讓我明白了一個工程,一個程序的設計,並非最後跑出來結果就算完事了,開發人員的能力也是能夠量化的,要一改以前大一大二那種打題目的思惟方式,多從工程的角度去看待問題,去分析和設計程序。

相關文章
相關標籤/搜索