Valid Sudoku

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求

Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.
    在这里插入图片描述

A partially filled sudoku which is valid.

The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’.

Example 1:
Input:

[
  ["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"]
]

Output: true

Example 2:
Input:

[
  ["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"]
]

Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being
modified to 8. Since there are two 8’s in the top left 3x3 sub-box, it is invalid.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.
  • The given board contain only digits 1-9 and the character ‘.’.
  • The given board size is always 9x9.

确定9x9数独板是否有效。 只需要根据以下规则验证已填充的单元格:

  1. 每行必须包含数字1-9而不重复。
  2. 每列必须包含数字1-9而不重复。
  3. 网格的9个3x3子框中的每一个必须包含数字1-9而不重复。

注意:

  • 数独板(部分填充)可能有效但不一定是可解决的。
  • 只需要根据上述规则验证已填充的单元格。
  • 给定的数独板仅包含数字1-9和字符’。’。
  • 给定的数独板尺寸始终为9x9。

2,题目思路

对于这道题,要求判断一个数独板是否是有效的。

数独,也就是拉丁方或者幻方,组合数学的一个课题,在这道题中,给出的数独板是一个9*9的形式,要保证横、竖以及三乘三的子框都是1-9,没有重复的数字,数独板是有空白的,判断目前的数独板是否是可行的,即当前的数字安排是否满足上述三个条件。

明白了这三个判断条件,剩下的就比较好办了:
定义三个数组:

  • int row[9][10]
  • int col[9][10]
  • int subBox[9][10]

分别表示行、列、子框中出现的数字的记录。
一维参数为9,因为行、列、子框都是从0到8的。
二维参数为10,因为数字是从1-9的。

其中子框:

0		1		2
3		4		5
6		7		8

因此,子框的索引:

  • int subIndex = i/3*3 + j/3
    上面的式子,看似是i/3*3发生了约分,最终还是i,但其实并不是这样,原因还是在于C++的除运算的特点。

3,代码实现

static auto speedup = [](){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int row[9][10] = {0}, col[9][10] = {0}, subBox[9][10] = {0};

        for(int i = 0;i<9;i++){
            for(int j = 0;j<9;j++){
                int n = board[i][j] == '.'? 0 : board[i][j]-'0';
                if(n == 0)
                    continue;
                if(++row[i][n] > 1)
                    return false;
                if(++col[j][n] > 1)
                    return false;
                int subIndex = i/3*3 + j/3;
                if(++subBox[subIndex][n] > 1)
                    return false;
            }
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值