軟體工程實踐 2017 第二次作業(部分)

2022-07-26 11:33:16 字數 1377 閱讀 1656

課程部落格目錄:軟工課程作業部落格目錄-031502627

專案more

每一行、每一列、每乙個粗線宮(3*3)內的數字均含1-9,不重複。

n //數獨棋盤個數

隨機生成n個不重複的已解答完畢的數獨棋盤,並輸出到sudoku.txt中,並且左上角的第乙個數為:(學號後兩位相加)% 9 + 1。即 ( 2 + 7 ) % 9 + 1 = 1。

首先我之前從未做過數獨題目,也不知道數獨的規則。從題目描述中了解到了數獨棋盤要滿足的條件,要每一行、每一列、每乙個九宮格都有 1-9 不重複的出現,而且左上角必須是 1(我自己的學號算出來的)。

首先,要有乙個生成一系列隨機座標的函式,生成如 (x, y) 的座標組。x 表示橫座標,y 表示縱座標。

接著進行判斷,當該座標左邊,上邊都不重複的話就填入,否則將有衝突的座標 + 1,依次迴圈,正常情況下總可以填入。當出現無法填入的情況時,若當前填入的數是 a,則將全部的 a、a - 1、a - 2 置 0,從 a - 2 開始填入,當重複次數到達規定閾值的時候還不能成功填入,就全部清楚,從頭開始。此處為溯回的思想。此時不考慮矩陣變換,那麼程式大概的流程如下:

當前填入數 a = 1;

檢查當前九宮格位置(x,y),

若 x = y = 1 則填入最左上角一格,

否則生成隨機座標

檢查隨機座標是否合法, // judge()

若不合法則將對應座標 + 1,

若兩次內成功填入,進入下乙個九宮格,重複,

若無法填入,則清除之前 a , a - 1, a - 2, 從這裡重新填入,直到全部的數全部成功填入,

輸出,初始化,進入下一次迴圈

由於演算法較為複雜,所以從裡向外來實現演算法。

首先,定義sudoku[3][3]pos_s[2]pos_l[2]分別為儲存數獨棋盤隨機座標的陣列當前九宮格座標。定義#define random(x) (rand() % x + 1)來生成指定範圍內的隨機數。

接著,用judge()函式來判斷是否可填入:

bool judge()            //判斷是否可以填入 返回為 1 則可填入

}if(flag == 1)}}

return flag;

}

[1] swing數獨遊戲(一):終盤生成之矩陣轉換法

[2] swing數獨遊戲(二):終盤生成之隨機法

軟體工程實踐2017第二次作業

github鏈結 1 拿到題目後,覺得這題目和八皇后的題挺像的,都是行列衝突問題,因此覺得可以通過將乙個99的數獨圖變成9個33的圖,對每張33的圖進行數字的填充,例如先將1填入9張小圖中。按以上思路寫完程式後,在行數下移的同時還需要在對應的圖中找到下乙個數填入的位址,產生了可能會跳過某一行填入數值...

軟體工程實踐2017第二次作業

github連線 利用程式隨機構造出n個已解答的數獨棋盤 輸入 數獨棋盤題目個數n 0 n 1000000 輸出 隨機生成n個不重複的已解答完畢的數獨棋盤,並輸出到sudoku.txt中。參考 其實看了這個 以後,我深受影響,把自己的設想都推翻了,總覺得自己的方法不太好,想學習這個方法。我認真理解了...

軟體工程實踐2017第二次作業

預估耗時 分鐘 實際耗時 分鐘 planning 計畫20 10 estimate 估計這個任務需要多少時間 2010 development 開發375 465 analysis 需求分析 包括學習新技術 3030 design spec 生成設計文件 1010 design review 設計複...