LeetCode36.有效的数独(Python,C)

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

解题思路

题目并没有让我们对数独进行解题,那么我们只要保证数独每一个数的“合法性”,想要保证数独的“合法性”那么就要符合题目给的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;
}

运行

 

 

 

40d34c5fa9c9424ab1437dbb674a7fa6.jpg

 

 

 

3ac40c96123549959b83d38c82cd215e.jpg 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值