判斷一個(gè) 9x9 的數(shù)獨(dú)是否有效斜做。只需要根據(jù)以下規(guī)則箭启,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可知市。
- 數(shù)字 1-9 在每一行只能出現(xiàn)一次蟹瘾。
- 數(shù)字 1-9 在每一列只能出現(xiàn)一次芹务。
- 數(shù)字 1-9 在每一個(gè)以粗實(shí)線分隔的 3x3 宮內(nèi)只能出現(xiàn)一次择份。
數(shù)獨(dú)部分空格內(nèi)已填入了數(shù)字狸吞,空白格用 '.' 表示胆描。
思路:
每一行必須是數(shù)字1~9且不重復(fù)
每一列必須是數(shù)字1~9且不重復(fù)
每一個(gè)小九宮格(互不交叉炬灭,總共九個(gè)小九宮格)必須是數(shù)字1~9且不重復(fù)
依次檢查每行醋粟,每列,每個(gè)子九宮格是否出現(xiàn)重復(fù)元素重归,如果出現(xiàn)返回false米愿,否則返回true.
難點(diǎn)在于表示第i個(gè)九宮格每個(gè)格點(diǎn)的坐標(biāo)。
觀察行號(hào)規(guī)律:
第0個(gè)九宮格:000111222; 第1個(gè)九宮格:000111222; 第2個(gè)九宮格:000111222;
第3個(gè)九宮格:333444555; 第4個(gè)九宮格:333444555; 第5個(gè)九宮格:333444555;
第6個(gè)九宮格:666777888; 第7個(gè)九宮格:666777888; 第8個(gè)九宮格:666777888;
可見(jiàn)對(duì)于每三個(gè)九宮格行號(hào)增3鼻吮;對(duì)于單個(gè)九宮格育苟,每三個(gè)格點(diǎn)行號(hào)增1。
因此第i個(gè)九宮格的第j個(gè)格點(diǎn)的行號(hào)可表示為i/3*3+j/3(每個(gè)小九宮格j都是從0~9遞增)
觀察列號(hào)規(guī)律:
第0個(gè)九宮格:012012012; 第1個(gè)九宮格:345345345; 第2個(gè)九宮格:678678678;
第3個(gè)九宮格:012012012; 第4個(gè)九宮格:345345345; 第5個(gè)九宮格:678678678;
第6個(gè)九宮格:012012012; 第7個(gè)九宮格:345345345; 第8個(gè)九宮格:678678678;
可見(jiàn)對(duì)于下個(gè)九宮格列號(hào)增3椎木,循環(huán)周期為3违柏;對(duì)于單個(gè)九宮格博烂,每個(gè)格點(diǎn)行號(hào)增1,周期也為3漱竖。
周期的數(shù)學(xué)表示就是取模運(yùn)算mod禽篱。
因此第i個(gè)九宮格的第j個(gè)格點(diǎn)的列號(hào)可表示為i%3*3+j%3(每個(gè)小九宮格j都是從0~9遞增)
部分填充的有效數(shù)獨(dú),不需要填充
細(xì)節(jié)分析題:
(1)檢查行
(2)檢查列
(3)檢查9個(gè)子宮格
代碼實(shí)現(xiàn)
使用HashSet:
class Solution {
public boolean isValidSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
Set<Character> row = new HashSet<Character>();
Set<Character> col = new HashSet<Character>();
Set<Character> cube = new HashSet<Character>();
for (int j = 0; j < 9; j++) {
// 檢查第i行闲孤,在橫坐標(biāo)位置
if (board[i][j] != '.' && !row.add(board[i][j])) {
return false;
}
// 檢查第i行谆级,在橫坐標(biāo)位置
if (board[j][i] != '.' && ! col.add(board[j][i])) {
return false;
}
// 行號(hào)+偏移量
int rowIndex = 3 * (i / 3) + j / 3;
// 列號(hào)+偏移量
int colIndex = 3 * (i % 3) + j % 3;
// 每個(gè)九宮格,共9個(gè)
if (board[rowIndex][colIndex] != '.' && ! cube.add(board[rowIndex][colIndex])) {
return false;
}
}
}
return true;
}
}