首页 > 代码库 > [LeetCode] Valid Sudoku

[LeetCode] 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: A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

方法:不必把空格都填好,只需检测给出的已经填好的数是否在行中、列中、小区域中重复,so easy,并不是检测它是否能填满哦

方法1:

class Solution {public:    bool isValidSudoku(vector<vector<char> > &board) {          // Note: The Solution object is instantiated only once.           vector<int> row(9,0);        vector<int> col(9,0);        vector<int> tmp(9,0);         for(int i = 0; i < 9; i++)          {              row = tmp;            col = tmp;            for(int j = 0; j < 9; j++)              {                  if(board[i][j] != .)                  {                      if(row[board[i][j]-1] > 0)return false;                      else row[board[i][j]-1]++;                  }                  if(board[j][i] != .)                  {                      if(col[board[j][i]-1] > 0)return false;                      else col[board[j][i]-1]++;                  }              }          }          for(int i = 0; i < 9; i+=3)              for(int j = 0; j < 9; j+=3)              {                  row = tmp;                for(int a = 0; a < 3; a++)                      for(int b= 0; b < 3; b++)                          if(board[i+a][j+b] != .)                          {                              if(row[board[i+a][j+b]-1]>0)return false;                              else row[board[i+a][j+b]-1]++;                          }              }              return true;      }  };

方法2:

class Solution {public:    bool isValidSudoku(vector<vector<char> > &board) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        if(board.size()<9 || board[0].size()<9)           return false;               vector<bool> tmp(9,false);        vector<vector<bool> > r(9,tmp);        vector<vector<bool> > c(r);    vector<vector<bool> > b(r);                for(int i=0; i<9; i++)           for(int j=0; j<9; j++)           {               if(board[i][j]==.)                 continue;               int a = (i/3)*3 + j/3;               int number = board[i][j]-1;               if(r[i][number] || c[j][number] || b[a][number])                   return false;               r[i][number] = c[j][number] = b[a][number] = 1;           }        return true;    }};

方法3:

class Solution {public:    bool isValidSudoku(vector<vector<char> > &board) {        int row,row2;        int col,col2;        int sqr,sqr2;        int a,b,c;        for(int i=0;i<9;i++){            row=0;row2 = 0;            col=0;col2 = 0;            sqr = 0;sqr2 =0;            for(int j=0;j<9;j++){               a = board[i][j] - 0;               b = board[j][i] -  0;               c = board[3*(i%3)+j/3][3*(i/3)+j%3] - 0;               if(a>0) row2 ^= 1<< a;               if(b>0) col2 ^= 1<< b;               if(c>0) sqr2 ^= 1<< c;               if(row2 < row || col2<col || sqr2<sqr)                   return false;               row = row2;               col = col2;               sqr = sqr2;            }        }        return true;    }};

 

[LeetCode] Valid Sudoku