LeetCode:36. Valid Sudoku,数独是否有效
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,数独是否有效的更多相关文章
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
		
三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...
 - leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法
		
Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...
 - LeetCode 36 Valid Sudoku
		
Problem: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board ...
 - 蜗牛慢慢爬 LeetCode 36.Valid Sudoku [Difficulty: Medium]
		
题目 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
 - Java [leetcode 36]Valid Sudoku
		
题目描述: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board cou ...
 - [LeetCode] 36. Valid Sudoku 验证数独
		
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...
 - [leetcode]36. Valid Sudoku验证数独
		
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...
 - LeetCode 36 Valid Sudoku(合法的数独)
		
题目链接: https://leetcode.com/problems/valid-sudoku/?tab=Description 给出一个二维数组,数组大小为数独的大小,即9*9 其中,未填入 ...
 - LeetCode 36. Valid Sudoku (Medium)
		
题目 Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according ...
 
随机推荐
- require.js 源码解读——配置默认上下文
			
首先,我们先来简单说一下,require.js的原理: 1.载入模块 2.通过模块名解析出模块信息,以及计算出URL 3.通过创建SCRIPT的形式把模块加载到页面中. 4.判断被加载的脚本,如 ...
 - javaWEB与JSP指令
			
JSP三大指令 一个jsp页面中,可以有0~N个指令的定义!1. page --> 最复杂:<%@page language="java" info="xx ...
 - JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换
			
本篇博客我们就来聊一下Spring框架中的观察者模式的应用,即事件的发送与监听机制.之前我们已经剖析过观察者模式的具体实现,以及使用Swift3.0自定义过通知机制.所以本篇博客对于事件发送与监听的底 ...
 - [认证授权] 2.OAuth2(续) & JSON Web Token
			
0. RFC6749还有哪些可以完善的? 0.1. 撤销Token 在上篇[认证授权] 1.OAuth2授权中介绍到了OAuth2可以帮我们解决第三方Client访问受保护资源的问题,但是只提供了如何 ...
 - Flash加载ini文件!
			
这个帖子里有解决方案: http://bbs.9ria.com/thread-405128-1-1.html
 - Xamarin android 的WebClient Json下载并存储本地及sqlite数据库
			
这一点雕虫小技可能对熟悉的人来说已经不值一提.但是我想,既然这些都是常用的功能,集成在一起做个笔记也有点意义吧. 首先,json 是传递数据的事实标准了.所以先说一下将它从服务器端下载下来..net ...
 - 给 Java 学习者的超全教程整理
			
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 网上有很多 Java 教程,无论是基础入门还是开发小项目的教程都比比皆是,可是系统的很少,对于Java 学习者来说找到系 ...
 - memcached的安装以及php两个扩展软件安装(memcache、memcached)
			
百度云安装包:http://pan.baidu.com/s/1pKZeDwn k3ap 1.安装memcached Memcached是基于libevent的事件处理,所以它的安装依赖libeven ...
 - 移动开发中使用的一些meta头部标签整理
			
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
 - js alert(“”)弹框 自定义样式
			
首先用css渲染一个样式 #msg{ height: 2rem; text-align: center; position: fixed; top: 50%; margin-top: -1rem; l ...