请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 '.' 表示。
示例 1:
输入:board =
[["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:
输入:board =
[["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 存在, 因此这个数独是无效的。
看到多维数组就萎了。但是作为一个小白怎么能退缩!!!学习一下vector多维。顺便把视野拓宽,毕竟不能一直以一维的方式分析问题。分析题目:首先各行各列都必须是不重复的数字。如果是"."我们之间跳过就好了。然后 每个3*3的小方块也不能有重复。
所以现在我们的数组就是vector<9,vector
首先先看我们用一维数组实现!
第一种方法
| 5 | 3 | . | . | 7 | . |
| 6 | . | . | 1 | 9 | 5 |
| . | 9 | 8 | . | . | . |
| 8 | . | . | . | 6 | . |
| 4 | . | . | 8 | . | 3 |
| 7 | . | . | . | 2 | . |
这是个6*6的矩阵 我们先来看看他的结构
将他变成一个一维数组。也就是36个长度的。我们来写一下。
Nums[35] = {5,3,0,0,7,0,6,0,0,1,9,5,0,9,8,0,0,0,8,0,0,0,6,0,4,0,0,8,0,3,7,0,0,0,2,0}
Int i= 0;
- i到i+5 每个是一行
- i到i+6 自然是每一列了
- 矩阵块是最难表示的。第一个矩阵块位置是,第一行0,1,2,第二行6,7,8,第三行12,13,14
| 5 | 3 | . |
| 6 | . | . |
| . | 9 | 8 |
第二个矩阵块位置是,第一行3,4,5第二行9,10,11,第三行15,16,17
| . | 7 | . |
| 1 | 9 | 5 |
| . | . | . |
是否看出来一点规律:
Int j = -3;
第一个矩阵块:第一行就是j+3,j+4,j+5
第二行就是j+9,j+10,j+11;
第三行就是j+15;j+16;j+17;
第二个矩阵块:j = 0时
也能表示
关键是第三个矩阵块:8的位置是18 如何让j = 18
| 8 | . | . |
| 4 | . | . |
| 7 | . | . |
其实很简单 我们只需要在j+3的时候加入一个判断就好了
If(j ==传入的二维数组的行数-2){ j+15= j;}
所以9*9也一样就不多赘述了。
class Solution {
public:
bool isValidSudoku(vector>& board) {
vector one;
for(int i = 0;i
运行了这么多 说明我们的想法是没有错误的。接下来把代码补充完整。
在穿插一下 我们接下来创建3个bool值 判断是否有对应的错误。那么 最后把3个bool值相加
c++的机制是如果是0就是flase 如果非0就返回true 。
class Solution {
public:
bool isValidSudoku(vector>& board) {
vector one;
for(int i = 0;i
我这样写 太复杂啦!!!只是这是一种解决的方法。强烈不推荐。数学功底比较差,没有办法把所有的都集中化成一个精简变量和循环。
class Solution {
public:
bool isValidSudoku(vector>& board) {
int row[9][9]={0};
int column[9][9]={0};
int box[9][9]={0};
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
int box_index = i / 3 * 3 + j / 3;
int temp = board[i][j]-'0'-1;
if(temp=='.'-'0'-1) continue;
if (row[i][temp]==1 || column[j][temp]==1 || box[box_index][temp]==1) return false;
++row[i][temp];
++column[j][temp];
++box[box_index][temp];
}
}
return true;
}
};
作者:duyanshu
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2f9gg/?discussion=YZKhCK
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



