LeetCode:36. Valid Sudoku,数独是否有效 :
来源:互联网 发布:linux服务器ftp服务开 编辑:程序博客网 时间:2024/06/18 12:40
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(数独游戏)
0 0
- LeetCode:36. Valid Sudoku,数独是否有效 :
- leetcode 36. Valid Sudoku 数独有效
- Valid Sudoku 检查数独是否有效 @LeetCode
- leetcode 36. Valid Sudoku-有效数独|哈希表
- LeetCode-36. Valid Sudoku (JAVA)(有效数独)
- 有效数独 Valid Sudoku
- valid-sudoku判断是否是有效数独
- [leetcode]Valid Sudoku(判断有效数独 C语言实现)
- LeetCode 36 Valid Sudoku(有效数独)
- leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
- LeetCode----36. Valid Sudoku(有效数读)
- Valid Sudoku 有效的数独
- Leetcode #36. Valid Sudoku 数独游戏验证 解题报告
- LeetCode 36. Valid Sudoku(数独游戏)
- Leetcode:36.Valid Sudoku 初始化数独数组是否合法判断
- LeetCode Valid Sudoku数独有效性验证
- [LeetCode] [数独问题] Valid Sudoku
- 算法课第十一周作业 | Longest Consecutive Sequence
- 实例变量与static变量的区别
- 多线程和多进程的管理
- 使用qsort排序一个整型数组,一个浮点型数组,一个字符串数组
- GitHub For Windows 使用教程
- LeetCode:36. Valid Sudoku,数独是否有效 :
- Yii2 使用Event -2 ,如何使用事件_@TERRY
- 自己实现一个bubble_sort(冒泡排序),可以完成不同类型数据的排序
- Linux中确定CPU的情况
- 原码反码补码
- es6 -- 语法(扩展)
- Yii2 使用Event -1 ,如何使用事件_@TERRY
- 0507 #22 NYISTOJ 素数求和问题
- Yii2 自带事件的用法_@foreach