題目:兩數(shù)之和
描述:
判斷一個(gè)數(shù)獨(dú)是否有效选调,根據(jù):Sudoku Puzzles - The Rules狮腿。
(數(shù)獨(dú)規(guī)則: 每一行不能有重復(fù)的數(shù)字;每一列不能有重復(fù)的數(shù)字稠肘;將數(shù)獨(dú)框劃分為三行三列冀痕,沒9個(gè)小方格不能有重復(fù)荔睹;)
數(shù)獨(dú)部分填了數(shù)字,空的部分用 '.'
表示金度。
image
一個(gè)部分填充是有效的數(shù)獨(dú)。
說明:
一個(gè)有效的數(shù)獨(dú)(填了一部分的)不一定是可解的严沥,只要已經(jīng)填的數(shù)字是有效的即可猜极。
思路:
根據(jù)題意及數(shù)獨(dú)的規(guī)則,只需要判斷每一行的數(shù)字消玄,每一列的數(shù)字和9宮格的數(shù)字有沒有重復(fù)即可跟伏。可以用Set進(jìn)行解題翩瓜。board[i][j]表示行受扳,board[j][i]表示列,當(dāng)i 和 j 對 3 進(jìn)行求余為0時(shí)兔跌,表示一個(gè)9宮格勘高。
代碼如下:
class Solution {
//有效的數(shù)獨(dú)
func isValidSudoku(_ board: [[Character]]) -> Bool {
var rowSet = Set<Character>()
var colSet = Set<Character>()
for i in 0..<9 {
rowSet.removeAll()
colSet.removeAll()
for j in 0..<9 {
if i % 3 == 0 && j % 3 == 0 {
//檢查塊
if !checkBlock(board, row: i, col: j) {
return false
}
}
if board[i][j] != "." {
//檢查行
if rowSet.contains(board[i][j]) {
return false
}
rowSet.insert(board[i][j])
}
if board[j][i] != "." {
//檢查列
if colSet.contains(board[j][i]) {
return false
}
colSet.insert(board[j][I])
}
}
}
return true
}
//檢查塊是否有效
private func checkBlock(_ board: [[Character]], row: Int, col: Int) -> Bool {
var blockSet = Set<Character>()
for i in row..<(row + 3) {
for j in col..<(col + 3) {
if board[i][j] != "." {
if blockSet.contains(board[i][j]) {
return false
}
blockSet.insert(board[i][j])
}
}
}
return true
}
}