LeetCode:36. Valid Sudoku,数独是否有效 :

**题目: **

LeetCode:36. Valid Sudoku

**描述: **

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

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



A partially filled sudoku which is valid.

**分析: **

  • 判断一个数独是否有效的判断条件有三个:行、列、子格里都没有重复的1-9数字

    思路如下:

    1、遍历所有的数组元素,对其中数据进行如下操作:

    2、遇到空格也就是“.”时,判断是有效的,并且在定义数组的对应位置上设置其为1,表示已查到该项;

    3、首次遇到某数字时,首先设置其在数组中的位置为1,判定有效;

    4、当且仅当遇到重复数字时,判定无效。

    所以程序应该分为两部分,一部分编写遍历算法,将元素进行三种方式的比对。另一部分用来编写检验是否有效。

    5、细节实现

    1)遍历算法:

    (1)遍历数组元素board[i][j],判断三个条件:

    (2)遍历元素对应逻辑九宫格位置:

    anRow[j] = board[i][j],

    anCloum[i][j] = board[i][j],

    anSonSudoKu[j / 3 * 3 + i / 3][j % 3 * 3 + i % 3] = board[i][j]

    2) 检验有效(在逻辑九宫格中标识状态位,1位已查询到):

    (1)首次遇到某数字时,首先设置其在数组中的位置为1,判定有效

    (2)当且仅当遇到重复数字时,判定无效

    (3)首次遇到某数字时,首先设置其在数组中的位置为1,判定有效;

**代码: **

bool checkValid(int anArr[], int nVal)
{
// 2) 检验有效:
//(1)首次遇到某数字时,首先设置其在数组中的位置为1,判定有效
//(2)当且仅当遇到重复数字时,判定无效
// (3) 遇到空格也就是“.”时,判断是有效的,并且在定义数组的对应位置上设置其为1,表示已查到该项;
if (nVal < 0) // 判断(3) “.”情况
{
return true;
}
if (1 == anArr[nVal - 1]) // 判断(2) 重复数字情况
{
return false;
}
//(1) 首次遇到某数字
anArr[nVal - 1] = 1;
return true;
} bool isValidSudoku(const vector<vector<char>>& board)
{
// 1)遍历数组
int anRow[9] = { 0 }; // 用于存储一行的元素比对结果
int anCloum[9] = { 0 }; // 用于存储一列中的元素比对结果
int anSonSudoKu[9] = { 0 }; // 用于存储子格的元素比对 for (int i = 0; i < 9; i++)
{
memset(anRow, 0, sizeof(anRow));
memset(anCloum, 0, sizeof(anCloum));
memset(anSonSudoKu, 0, sizeof(anSonSudoKu));
for (int j = 0; j < 9; j++)
{
if (!checkValid(anRow, board[i][j] - '0') // 检查第i行(0开始计数)
|| checkValid(anCloum, board[j][i] - '0') // 检查第j行(实际为第j列,0开始)
|| checkValid(anSonSudoKu, board[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3] - '0') // 检查 board[i][j] 元素所在 i / 3 * 3 所在行的3个九宫格的三个元素
)
{
return false;
}
}
}
return true;
}

备注:

好记性不如烂笔头!这道题思考了好几天,才发现人和人差距是很大的~

借鉴了tenos大神的解法LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)

LeetCode:36. Valid Sudoku,数独是否有效的更多相关文章

  1. leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题

    三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...

  2. leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法

    Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...

  3. LeetCode 36 Valid Sudoku

    Problem: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board ...

  4. 蜗牛慢慢爬 LeetCode 36.Valid Sudoku [Difficulty: Medium]

    题目 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  5. Java [leetcode 36]Valid Sudoku

    题目描述: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board cou ...

  6. [LeetCode] 36. Valid Sudoku 验证数独

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

  7. [leetcode]36. Valid Sudoku验证数独

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

  8. LeetCode 36 Valid Sudoku(合法的数独)

    题目链接: https://leetcode.com/problems/valid-sudoku/?tab=Description   给出一个二维数组,数组大小为数独的大小,即9*9  其中,未填入 ...

  9. LeetCode 36. Valid Sudoku (C++)

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

随机推荐

  1. Android draw9patch 图片制作与使用

    理解一下4句话: 上边 决定左右拉升不变形 左边 决定上下拉升不变形 右边 设置内容高度区域 下边 设置内容宽度区域 下面我拿张图片分别举例说明: 1.QQ多彩气泡 聊天对话框也用.9图片制作 继承过 ...

  2. Configuration

    package edu.fzu.ir.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  3. CSMA/CD协议

    为了通信的简便,以太网采取了两种重要的措施: 第一:采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据: 第二:以太网对发送的数据帧不进行编号,也不要求对方发回确认. 因此,以太网提供 ...

  4. 关于http接口开发中json格式数据编码问题处理

    关于http接口开发中json格式数据编码问题处理 在实际工作中,接口很多时候返回json格式,但有时返回的格式会有编码问题 假设如下接口:http://service.test.com/interf ...

  5. Storyboard 自定义转场动画

    在storyboard中,segue有几种不同的类型,在iphone和ipad的开发中,segue的类型是不同的.在iphone中,segue 有:push,modal,和custom三种不同的类型, ...

  6. 团队作业8——第二次项目冲刺(Beta阶段)5.20

    1.当天站立式会议照片 会议内容: 本次会议为第二次会议 本次会议在陆大楼2楼召开,本次会议内容: ①:检查第一次任务完成情况 ②:做第二次任务的详细分工 ③:规定完成时间是在第三次任务之前 ④:遇到 ...

  7. 工信部:我国4G用户近9.5亿 用户平均使用流量近2G

    刚刚沿着广场转了一圈,我竟发现自己离他只有几步之遥,又在那条人行道上,刚才催促我前进的自豪感突然之间被惊慌代替.陌生人看着我,脸上流露出一种遗憾的表情,他向我靠近,轻轻摇着脑袋,像是为某个不受人控制的 ...

  8. 安装PHP的mongodb驱动速记

    安装环境:Centos 6.5   PHP 5.3.27 这里PHP已经安装,安装路径为: /usr/local/php/ 下载安装文件: http://pan.baidu.com/s/1pJ0Spi ...

  9. LiDAR、LAS、LAS Dataset与点云

    LiDAR Light Detection And Ranging,激光探测及测距,是一种光学遥感技术,使用激光对地球表面的密集采样,产生高精度X.Y.Z测量值. 激光雷达系统的主要硬件组成部分包括一 ...

  10. SpringBoot------Servlet3.0的注解自定义原生Listener监听器

    前言 常用监听器: //contextListener可以监听数据库的连接,第三方组件的交互,还有静态文件加载等等 servletContextListener HttpSessionListener ...