解题思路
题目并没有让我们对数独进行解题,那么我们只要保证数独每一个数的“合法性”,想要保证数独的“合法性”那么就要符合题目给的3个条件。
条件:
1.数字1-9在每一行只能出现一次
2.数字1-9在每一列只能出现一次
3.数字1-9在一个以实粗实线分隔的3x3宫内只能出现一次.
注意事项:
1.一个有效的数独不一定是可解的
2.只要根据条件验证填入的数字是否“合法”即可
3.空白格用'.'表示
实现思路(伪代码)
首先可以创建3个二维数组,也就是哈希表,然后判断出现过的数字是否重复了。
前两个的实现比较简单,重点是第三个。
先说一下实现方法公式 y / 3 + (x / 3) * 3
9*9的board是由9个3*3的小board组成的,那么我们将大board拆分成3个小board
代码(Python)
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
row = [[0] * 10 for _ in range(9)]
col = [[0] * 10 for _ in range(9)]
box = [[0] * 10 for _ in range(9)]
for i in range(9):
for y in range(9):
if board[i][y] == '.':
continue
num = int(board[i][y])
if row[i][num] != 0 or col[y][num] != 0 or box[y // 3 + (i // 3) * 3][num] != 0:
return False
row[i][num],col[y][num],box[y // 3 + (i // 3) * 3][num] =1,1,1
return True
代码(C)
bool isValidSudoku(char** board, int boardSize, int* boardColSize)
{
int row[9][9];
int col[9][9];
int box[9][9];
for(int i = 0;i < 9;i++)
{
for(int y = 0;y < 9;y++)
{
if(board[i][y] == '.')
{
continue;
}
char c = board[i][y];
int num = c - '0' - 1;
if (row[i][num] == 1 || col[y][num] == 1 || box[y / 3 + (i / 3) * 3][num] == 1)
{
return 0;
}
row[i][num] = 1;
col[y][num] = 1;
box[y / 3 + (i / 3) * 3][num] = 1;
}
}
return 1;
}
运行

该博客介绍了如何编写算法来验证数独的合法性,包括检查每行、每列和每个3x3宫格中数字1-9是否唯一出现。通过创建哈希表记录每个位置的数字,并利用公式y/3+(x/3)*3确定3x3宫格的位置,实现了有效数独的判断。代码提供了Python和C两种实现方式。

431

被折叠的 条评论
为什么被折叠?



