Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
A partially filled sudoku which is valid. The Sudoku board could be partially filled, where empty cells are filled with the character . Example 1: Example 2: Note:
| 判斷一個 9x9 的數獨是否有效。隻需要根據以下規則,驗證已經填入的數字是否有效即可。
上圖是一個部分填充的有效的數獨。 數獨部分空格内已填入了數字,空白格用 表示。 示例 1: 示例 2: 說明:
|
思路:數獨每行每列每個格子 都不重複。定義三個标記的存儲空間。周遊每一個元素的時候判斷它在行列或格子是否重複。重複則傳回false。這裡需要一個将格子位置轉換:[3*(i/3)+j/3][n],表示 将原始數組i和j 坐标轉化為 第幾個格子的坐标。
注意c++定義二維m行n列的bool數組可以一句話搞定vector<vector<bool>> rowflag(m,vector<bool>(n,false));
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int m=board.size(),n=board[0].size();
if(m==0 || n==0) return false;
vector<vector<bool>> rowflag(m,vector<bool>(n,false));
vector<vector<bool>> colflag(m,vector<bool>(n,false));
vector<vector<bool>> cellflag(m,vector<bool>(n,false));
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
if(board[i][j]<='9' && board[i][j]>='1')
{
int tmp = board[i][j]-'1';
if(rowflag[i][tmp] || colflag[tmp][j] ||
cellflag[3*(i/3)+j/3][tmp])
return false;
rowflag[i][tmp]=true;
colflag[tmp][j]=true;
cellflag[3*(i/3)+j/3][tmp] = true;
}
}
}
return true;
}
};
class Solution:
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
row= [[0]*9 for _ in range(9)]
col= [[0]*9 for _ in range(9)]
cell= [[0]*9 for _ in range(9)]
for i in range(9):
for j in range(9):
if(board[i][j]<='9' and board[i][j]>='1'):
n = int(board[i][j])-1
pos = 3*int(i/3)+int(j/3)
if row[i][n]!=0 or col[n][j]!=0 or cell[pos][n]!=0:
return False
row[i][n]=1
col[n][j]=1
cell[pos][n]=1
return True