第二次作業 個人專案實戰

2022-05-04 08:39:09 字數 3609 閱讀 2501

github專案位址

作業位址

利用程式隨機構造出n個已解答的數獨棋盤 。

輸入

數獨棋盤題目個數n

輸出

隨機生成n個 不重複 的 已解答完畢的 數獨棋盤,並輸出到sudoku.txt中,輸出格式見下輸出示例。

在生成數獨矩陣時,左上角的第乙個數為:(學號後兩位相加)% 9 + 1。例如學生a學號後2位是80,則該數字為(8+0)% 9 + 1 = 9,那麼生成的數獨棋盤應如下(x表示滿足數獨規則的任意數字):

輸入示例

sudoku.exe -c 1
輸出示例

4 5 1 7 8 2 3 6 9

7 8 6 4 9 3 5 2 1

3 9 2 1 5 6 4 8 7

5 2 7 6 4 9 8 1 3

9 6 8 5 3 1 2 7 4

1 3 4 2 7 8 6 9 5

8 1 5 3 6 7 9 4 2

6 7 3 9 2 4 1 5 8

2 4 9 8 1 5 7 3 6

psp2.1

personal software process stages

預估耗時(分鐘)

實際耗時(分鐘)

planning

計畫30

40· estimate

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

2020

development

開發300

350· analysis

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

100180

· design spec

· 生成設計文件

3060

· design review

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

· coding standard

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

1015

· design

· 具體設計

3030

· coding

· 具體編碼

200180

· code review

· **複審

3040

· test

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

200250

reporting

報告20

20· test report

· 測試報告

2020

· size measurement

· 計算工作量

1020

· postmortem & process improvement plan

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

3025

合計1030

1250

解題心理歷程按照時間順序分以下幾個階段

一共2個類

一共7個函式:

生成第乙個小九宮格:

private char[,] a = new char[9, 9];             //二維陣列,用來存放整個數獨的每乙個數

private listmylist = new list(); //字元型list在函式begin()中初始化,使list包含字元1、2、3、5、6、7、8、9 (4為每個數獨的首個,無需在list中)

private void findfirst(int p)                    //尋找第乙個小九宮格

x = (p - 1) % 3;

y = (p - 1) / 3;

rand = re.next(1, 100); //隨機生成乙個數字為下面迴圈做準備

for (j = 0; j < mylist.count(); j++)

}

矩陣變化的方法原理,參照這位同學,但是值得一提的是,每次生成下個小九宮格的時候有兩種情況:

private void findall()                           //找到剩下的8個九宮格

for (w = 0; w < 2; w++) //兩種情況

for (e = 0; e < 2; e++) //兩種情況

for (r = 0; r < 2; r++) //兩種情況

if (count == over) return;

if (count < fast_max) write(); //理論上有645120個數獨,為了使用回溯時避免重複,最後一組16個數獨不用

if (count == over) return;

}if (count == over) return;

}if (count == over) return;

} if (count == over) return;

}}

我們知道,如果利用矩陣變換,一共可以生成645120(8!x2x2x2x2)個數獨,每16個的第乙個小九宮格是一樣的,為了避免重複,我們將最後的16個不在矩陣變換演算法中寫txt,我們利用最後這一組數獨來生成遞迴,在遞迴中寫txt,這樣生成的數獨劇不會重複了。

private void dfs(int p)                         //回溯尋找數獨

if (count == over) return; //尋找到足夠的數獨,return

if (p == 82) //找到乙個數獨,寫txt

x = (p - 1) % 9;

y = (p - 1) / 9;

rand = re.next(1, 100);

for (j = 1; j < 10; j++) }

}

執行測試結果如下截圖:

改進前

從效能分析的截圖上可以看出,wirte的效率太低下了,花了好長的時間。

改進後

從朋友口中得知,原來使用stream的時候輸出字元型別會快很多,於是對**做了大幅度的更改,將byte型的陣列,改為了char型的陣列,果然效果很明顯。

第二次作業 個人專案實戰

2,psp2.1 personal software process stages 預估耗時 分鐘 planning 計畫20 estimate 估計這個任務需要多少時間 20development 開發490 analysis 需求分析 包括學習新技術 60 design spec 生成設計文件 ...

第二次作業 個人專案實戰

預估耗時 分鐘 實際耗時 分鐘 planning 計畫80 80estimate 估計任務時間 2020 development 開發300 360analysis 需求分析 60120 design 生成設計文件60 design review 設計複審60 coding standard 規範 ...

第二次作業 個人專案實戰 數獨

利用程式隨機構造出n個已解答的數獨棋盤。輸入 數獨棋盤題目個數n 0 n 1000000 輸出 隨機生成n個 不重複的已解答完畢的 數獨棋盤,並輸出到sudoku.txt中,且左上角的第乙個數為 學號後兩位相加 9 1先初始化乙個二維陣列sudoku 9 9 再往裡面填數字,而第乙個數字是規定的,我...