Leetcode——36. Valid Sudoku

来源:互联网 发布:淘宝店铺页头怎么添加 编辑:程序博客网 时间:2024/05/16 16:15

题目

https://leetcode.com/problems/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.

Note:

解答

判断一个数独是否有效,开始时理解错题意了,这里只管数独是否有效,而不需要关心填上的数字是否能解开这个数独。
所以就是判断每行,每列,每块不能有重复数字。O(N^2)。
其中第二个方法是bit操作,有意思!

class Solution {public:    bool isValidSudoku(vector<vector<char>>& board) {        bool num1[9][9]={0},num2[9][9]={0},num3[9][9]={0};        for(int i=0;i<board.size();i++)            for(int j=0;j<board.size();j++)            {                if(board[i][j]!='.')                {                    int num=board[i][j]-'0'-1;//减一是为了换算到下标                    int k=i/3*3+j/3;//这一步很巧妙!!!把整个数独分成八块,每一块用k表示                    if(num1[i][num]||num2[j][num]||num3[k][num])//已经出现重复的了,不是valid数独                        return false;                    num1[i][num]=1,num2[j][num]=1,num3[k][num]=1;                }            }        return true;    }    //bit操作    bool isValidSudoku1(vector<vector<char>>& board) {    vector<short> col(9, 0);    vector<short> block(9, 0);    vector<short> row(9, 0);    for (int i = 0; i < 9; i++)     for (int j = 0; j < 9; j++) {         if (board[i][j] != '.') {             int idx = 1 << (board[i][j] - '0');             if (row[i] & idx || col[j] & idx || block[i/3 * 3 + j / 3] & idx)                return false;            row[i] |= idx;            col[j] |= idx;            block[i/3 * 3 + j/3] |= idx;         }     }     return true;  }};
0 0
原创粉丝点击