这题其实比较简单,我想复杂了,后来参考了网上的答案。
最简单的就是用位运算,因为只有行数,列数和小3*3的grid都是9,所以用int足够了。
注意board[i][j]会落在第(i/3*3+j/3)个grid。
#include <iostream>
#include <vector>
using namespace std;
bool isValidSudoku(vector<vector<char>>& board) {
if (board.size()!=9) return false;
vector<int> row(9,0), col(9,0), grids(9,0);
for (int i=0; i<9; ++i) {
if (board[i].size()!=9) return false;
for (int j=0; j<9; ++j) {
char c=board[i][j];
if (c=='.') continue;
int num=0x1<<(board[i][j]-'0');
if ((row[i]&num) || (col[j]&num) || (grids[i/3*3+j/3]&num))
return false;
row[i]|=num; col[j]|=num; grids[i/3*3+j/3]|=num;
}
}
return true;
}
int main()
{
vector<vector<char> > board{ {'.','.','.','.','5','.','.','1','.'},
{'.','4','.','3','.','.','.','.','.'},
{'.','.','.','.','.','3','.','.','1'},
{'8','.','.','.','.','.','.','2','.'},
{'.','.','2','.','7','.','.','.','.'},
{'.','1','5','.','.','.','.','.','.'},
{'.','.','.','.','.','2','.','.','.'},
{'.','2','.','9','.','.','.','.','.'},
{'.','.','4','.','.','.','.','.','.'} };
cout<<isValidSudoku(board);
return 0;
}
sdaf