生活随笔
收集整理的這篇文章主要介紹了
LeetCode 37 解数独
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
編寫一個(gè)程序,通過填充空格來解決數(shù)獨(dú)問題。一個(gè)數(shù)獨(dú)的解法需遵循如下規(guī)則:數(shù)字
1-9 在每一行只能出現(xiàn)一次。
數(shù)字
1-9 在每一列只能出現(xiàn)一次。
數(shù)字
1-9 在每一個(gè)以粗實(shí)線分隔的
3x3 宮內(nèi)只能出現(xiàn)一次。
空白格用
'.' 表示。
題解
深度優(yōu)先搜索
代碼
class Solution
{
public
:bool
dfs(vector
<vector
<char>>& board
,int index
,int n
,vector
<vector
<bool
>>& row
,vector
<vector
<bool
>>& col
,vector
<vector
<bool
>>& squ
,vector
<pair
<int,int>>& vec
){if (index
>=vec
.size()) return true
;int i
=vec
[index
].first
;int j
=vec
[index
].second
;for (int k
=1;k
<=n
;k
++){if (!row
[i
][k
]&&!col
[k
][j
]&&!squ
[((i
-1)/3)*3+(j
-1)/3+1][k
]){row
[i
][k
]=true
;col
[k
][j
]=true
;squ
[((i
-1)/3)*3+(j
-1)/3+1][k
]=true
;board
[i
-1][j
-1]=k
+'0';if (dfs(board
,index
+1,n
,row
,col
,squ
,vec
)) return true
;board
[i
-1][j
-1]='.';row
[i
][k
]=false
;col
[k
][j
]=false
;squ
[((i
-1)/3)*3+(j
-1)/3+1][k
]=false
;}}return false
;}void solveSudoku(vector
<vector
<char>>& board
) {int n
=board
.size();if (n
!=9) return ;vector
<vector
<bool
>> row(n
+1,vector
<bool
>(n
+1)),col(n
+1,vector
<bool
>(n
+1)),squ(n
+1,vector
<bool
>(n
+1));vector
<pair
<int,int>> vec
;for (int i
=1;i
<=n
;i
++){for (int j
=1;j
<=n
;j
++){if (board
[i
-1][j
-1]!='.'){row
[i
][board
[i
-1][j
-1]-'0']=true
; col
[board
[i
-1][j
-1]-'0'][j
]=true
; squ
[((i
-1)/3)*3+(j
-1)/3+1][board
[i
-1][j
-1]-'0']=true
; }else{vec
.push_back({i
,j
});}}}dfs(board
,0,n
,row
,col
,squ
,vec
);}
};
總結(jié)
以上是生活随笔為你收集整理的LeetCode 37 解数独的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。