leetcode 36 有效的数独
目录
一、题目描述
二、解题思路
整体思路
具体思路
(1)有效的数独的判断条件(需要同时满足)
(2)转化为代码判断
(3)函数思路
三、代码实现
一、题目描述
二、解题思路
整体思路
可以借鉴哈希表的思想来模拟判断数独的合法性。
具体思路
(1)有效的数独的判断条件(需要同时满足)
<1>字符'1'到'9'在每一行只能出现一次;
<2>字符'1'到'9'在每一列只能出现一次;
<3>字符'1'到'9'在每一个以粗实线分隔的3*3宫内只能出现一次。
(2)转化为代码判断
<1>字符'1'到'9'在每一行只能出现一次。可以引入bool数组Row[9][9],Row[row][c-'a']表示第row行是否出现字符c,如果出现了c,即为true,否则就为false;
<2>字符'1'到'9'在每一列只能出现一次。可以引入bool数组Col[9][9],Col[col][c-'a']表示第col列是否出现字符c,如果出现了c,即为true,否则就为false;
<3>字符'1'到'9'在每一个以粗实线分隔的3*3宫内只能出现一次。可以引入bool数组grid[3][3][9],grid[row/3][col/3][c-'a']表示第row/3行,第col/3列的3*3宫格中是否出现了字符c,如果出现了c,即为true,否则就为false;
1)划分3*3宫格:
grid[0][0]表示第0行,第0列的3*3宫格,经过观察我们发现:
表示第0行,第0列的3*3宫格内的所有位置其row/3==0且col/3==0,可以依照这个规律将9*9宫格进行分组。
2)在每个3*3宫格内进行判断:
grid[row/3][col/3][c-'a']表示第row/3行,第col/3列的3*3宫格中是否出现了字符c,如果出现了c,即为true,否则就为false。
(3)函数思路
遍历board二维数组,如果当前位置为数字字符,就进行合法性判断(Col、Row、grid):
<1>如果合法,就将对应的Col、Row、grid值修改为true;
<2>如果不合法,表示这不是一个合法的数独,直接返回false;
最后,如果遍历完成,均合法,则返回true,表示这个数独是合法的。
三、代码实现
class Solution {bool Row[9][9]={false};bool Col[9][9]={false};bool grid[3][3][9]={false};
public:bool isValidSudoku(vector<vector<char>>& board) {for(int row=0;row<9;row++)for(int col=0;col<9;col++){char c=board[row][col];if(c!='.'){if(Row[row][c-'1']||Col[col][c-'1']||grid[row/3][col/3][c-'1'])return false;else{Row[row][c-'1']=true;Col[col][c-'1']=true;grid[row/3][col/3][c-'1']=true;}}}return true;}
};