Github地址:https://github.com/LuoAiyue/031702601 git
(只能用於三宮格的菜鳥代碼)github
PSP表格數組
PSP | 預估耗時(小時) | 實際耗時(小時) |
---|---|---|
計劃 | 1 | 0.5 |
估計這任務須要多少時間 | 27 | 19 |
開發 | 3 | 2 |
需求分析 | 3 | 1 |
生成設計文檔 | 1 | 2 |
設計複審 | 2 | 0.5 |
代碼規範 | 1.5 | 0.5 |
具體設計 | 2 | 0.5 |
具體編碼 | 6 | 3 |
代碼複審 | 3 | 5 |
測試 | 2 | 2 |
報告 | 1 | 1 |
測試報告 | 1 | 0.5 |
計算工做量 | 1 | 0.5 |
過後總結,並提出過程改進計劃 | 0.5 | 0.5 |
合計 | 27 | 19 |
由於此次只作了三宮格的,因此實際完成時間比預計少不少函數
個人解題思路工具
解三宮格數獨學習
一、找出盤面上已知兩個數的兩行兩列,把這兩個交叉點填上測試
二、遍歷全部行,碰見有兩格已知點的,就把剩下一格補上,有的行全空的,就跳過編碼
三、遍歷全部列,把每一列剩下那格補上spa
上代碼設計
int a[3][3]; //用來存放錶盤的二維數組 int row[2] = { 0 }; //用來存放已知數的行 int line[2] = { 0 }; //用來存放已知數的列 int b[2]; //用來存放已知點 const int c[3] = { 1,2,3 };
這個是輸入函數
1 void input() 2 { 3 FILE* fp1; 4 fp1 = fopen("input.txt", "r"); 5 6 for (int i = 0; i < 3; i++) 7 { 8 for (int j = 0; j < 3; j++) 9 { 10 11 fscanf(fp1, "%d", &a[i][j]); 12 if (a[i][j] != 0) //找出已知點,並記錄下它們的行和列 13 { 14 row[t] = i; 15 line[t] = j; 16 b[t] = a[i][j]; 17 t++; 18 } 19 } 20 } 21 }
這個是填上交叉點的函數
void search() { int y = 6; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { if (b[i] == c[j]) y = y - c[j]; } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { if (a[row[i]][line[j]] == 0) { a[row[i]][line[j]] = y; } } } }
行遍歷函數
void hang() { int y = 6; for (int i = 0; i < 3; i++) { int temp = 0; //計數菌 for (int j = 0; j < 3; j++) { if (a[i][j] != 0) temp++; } if (temp == 2) //找出有兩個已知數的行 { for (int k = 0; k < 3; k++) //找出剩下那個數 { if (a[i][k] != 0) { y = y - a[i][k]; } } for (int f = 0; f < 3; f++) //將剩下那個數填入空格中 { if (a[i][f] == 0) { a[i][f] = y; } } y = 6; //每一重循環完畢,記得把y歸爲6 } else continue; } }
列遍歷和行遍歷類似,因此不放代碼了。
我在這裏定義了一個臨時變量y,用來計算空缺的那個數。由於恰好1+2+3=6,減去已知的數字,結果就是未知的那個。(運氣好,恰好遇到這種狀況,因此這隻能用於三宮格)
以前個人方法是遇到已知數,而後把c數組裏面的那個已知數置0,而後一個小循環把非0的那個數找出來,就是未知數。可是問題來了,後面這個c數組就不能變回{1,2,3},就不能繼續用了,就算我在第一重循環下面加了個int c[3]={1,2,3};也沒用。
後面我又想了一下,不如把c數組看成「工具人」,就用來比較是否相等,再在這函數裏定義一個同爲{1,2,3}的數組,用來修改成0。可是這個在函數裏定義的數組,也是和c數組同樣的啊,二重循環一次事後回不到初始狀態了,被本身蠢到了。
而後我又想到,既然未知數是0,那麼拿來和{1,2,3}比較,已知數確定能找到相等的,找不到相等的就是未知數咯。愚蠢的我忘記這是個二重循環,假如已知數中有個3,那麼它和1比較,確定不相等啊,就被看成未知數處理了。(再一次被本身蠢到,double kill)
我爲何這麼執着於在數組裏改數據呢,由於這樣就能夠應用到5宮這種7宮這種不用考慮宮的環境啦。
可能有人會說,既然你找未知數的方法都同樣,那爲何不寫個函數而後調用呢?我開始就是這麼寫的,可是出了點問題,致使傳遞參數的時候出現語法錯誤,順着這錯誤百度了一下也沒找到結果,由於趕時間因此就選擇了沒調用。只能怪本身曾經基礎沒打好啊。(因此菜是原罪= =)
代碼調試階段
測試樣例
總的來講,雖然代碼簡單,黑貓白貓,能捉到老鼠就是好貓。此次代碼全是本身的思路(由於簡單,百度上搜了下都是玩九宮格那些大佬),遇到問題也是本身一點一點悟出來的,沒有問同窗,對於我來講真的很可貴了TAT。此次代碼體驗深深感覺到沒打好基礎是什麼後果。後面的學習要更加努力鞭策本身,嚴格執行第二次做業的學習計劃。(流下了不學無術的眼淚)