數(shù)獨(すうどく,Sūdoku)是一種運用紙涮因、筆進行演算的邏輯游戲。玩家需要根據(jù)9×9盤面上的已知數(shù)字伺绽,推理出所有剩余空格的數(shù)字养泡,并滿足每一行、每一列奈应、每一個粗線宮內(nèi)的數(shù)字均含1-9澜掩,不重復。
問題:
構(gòu)造一個9*9的方格矩陣杖挣,玩家要在每個方格中肩榕,分別填上1至9的任意一個數(shù)字,讓整個棋盤每一列惩妇、每一行以及每一個3*3的小矩陣中的數(shù)字都不重復株汉。
解法一
首先用二維數(shù)組的結(jié)構(gòu)來存儲數(shù)獨游戲sudoku[][9],通過經(jīng)典的深度優(yōu)先搜索來生成一個可行解歌殃。
從[0][0]開始對于沒有處理過的格子獲得一個可取的值乔妈,在搜索過程中如果沒有發(fā)現(xiàn)可行的值則回溯,修改前一個格子的取值氓皱。直到所有的格子都取到可行的值為止路召,這時候我們就找到了一個可行的解。
算法流程圖:
算法復雜度:O(n^2)
解法二
置換法波材,就是用矩陣行交換和列交換股淡,這個方法的優(yōu)點就是速度很快,缺點就是只能構(gòu)造9!種廷区,離所有合法數(shù)獨總數(shù)差的很遠唯灵。
算法實現(xiàn)過程:
1.假設已經(jīng)有一個3 *3的矩陣是排列好的,具體的數(shù)字暫時用字母代替躲因,如下圖所示:
2.把整個數(shù)獨矩陣的各個小矩陣(也就是宮)分別命名為B1早敬,B2,...大脉,B9:
3.將已有的3*3矩陣放在B5的位置搞监,得到如下圖所示矩陣:
4.通過置換行的方法,把B4和B6矩陣填好镰矿。
5.對中央小矩陣的每一列做同樣的變換琐驴,得到B2和B8.