Leetcode演算法題(C語言)11--有效的數獨
阿新 • • 發佈:2018-12-13
題目:有效的數獨
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
1 數字 1-9 在每一行只能出現一次。
2 數字 1-9 在每一列只能出現一次。
3 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 ‘.’ 表示。
示例 1:
輸入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 輸出: true
示例 2:
輸入: [ ["8","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 輸出: false
解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。
但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。
說明:
一個有效的數獨(部分已被填充)不一定是可解的。
只需要根據以上規則,驗證已經填入的數字是否有效即可。
給定數獨序列只包含數字 1-9 和字元 ‘.’ 。
給定數獨永遠是 9x9 形式的。
程式碼實現:
bool isValidSudoku(char** board, int boardRowSize, int boardColSize) {
int i, j, k;
/* 判斷每行陣列中的值是否只出現一次 */
for(k = 0; k < boardRowSize; k++)
{
for(i = 0; i < boardColSize - 1; i++)
{
for(j = i + 1; j < boardColSize; j++)
{
if(board[k][i] == '.')
break;
else if(board[k][j] == '.')
continue;
else if(board[k][i] == board[k][j])
return false;
}
}
}
/* 判斷每列陣列中的值是否只出現一次 */
for(k = 0; k < boardColSize; k++)
{
for(i = 0; i < boardRowSize - 1; i++)
{
for(j = i + 1; j < boardRowSize; j++)
{
if(board[i][k] == '.')
break;
else if(board[j][k] == '.')
continue;
else if(board[i][k] == board[j][k])
return false;
}
}
}
/* 判斷3x3矩陣中的值是否只出現一次 */
int a = 0, b = 0, c = 0, d = 0;
int row = 0, col = 0;
int num;
for(num = 0; num < 9; num++)
{
for(a = row; a < 3 + row; a++)
{
for(b = col; b < 3 + col; b++)
{
/* 判斷值為.,則判斷下一個 */
if(board[a][b] == '.')
{
continue;
}
/* 判斷3x3矩陣是否有相等的值 */
for(c = 0 + row;c < 3 + row; c++)
{
for(d = 0 + col; d < 3 + col; d++)
{
if(board[c][d] == '.')
continue;
else if((a != c) && (b != d) && (board[a][b] == board[c][d]))
return false;
}
}
}
}
/* 移動至下一個3x3矩陣 */
col += 3;
if(col >= 9)
{
col = 0;
row += 3;
}
}
return true;
}
思考邏輯
1 先判斷每行中的每個元素除了’.‘是否有相同的;
2 判斷每列中的每個元素除了’.‘是否有相同的;
3 判斷每一個3x3矩陣中除了’.'是否有相同的;
4 都不同則返回true,否則返回false;