栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

自我修炼

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自我修炼

请你判断一个 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,vector9>

首先先看我们用一维数组实现!

第一种方法

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;

  1. i到i+5 每个是一行
  2. i到i+6 自然是每一列了
  3. 矩阵块是最难表示的。第一个矩阵块位置是,第一行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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号