課程部落格目錄:軟工課程作業部落格目錄-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 設計複...