# LeetCode Valid Sudoku数独有效性验证

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.

class Solution {
public:
static const int SQUARENUM = 9;
static const int LITTLESQU = 3;

bool isValidSudoku(vector<vector<char> > &board)
{
vector<char> vChar(SQUARENUM);
for (int i = 0; i < SQUARENUM; i++)
if (!rowValid(board[i])) return false;
return colValid(board) && squValid(board);
}

bool rowValid(vector<char> &vChar)
{
vector<bool> nine(SQUARENUM+1, 0);
for (int i = 0; i < SQUARENUM; i++)
{
if (vChar[i] != '.')
{
int t = vChar[i] - '0';
if (nine[t])
return false;
else
nine[t] = 1;
}
}
return true;
}

bool colValid(vector<vector<char> > &board)
{
vector<bool> nine(SQUARENUM+1,0);
for (int i = 0; i < SQUARENUM; i++)
{
for (int j = 0; j < SQUARENUM; j++)
{
if (board[j][i]!= '.')
{
int t = board[j][i] - '0';
if (nine[t])
return false;
else
nine[t] = 1;
}
}
nine.clear();
nine.resize(SQUARENUM+1, 0);
}
return true;
}

bool squValid(vector<vector<char> > &board)
{
vector<bool> nine(SQUARENUM+1, 0);
for (int i = 0; i < SQUARENUM; i++)
{
for (int j = 0; j < SQUARENUM; j++)
{
int row = j/LITTLESQU + i/LITTLESQU*LITTLESQU,
col = j%LITTLESQU + i%LITTLESQU*LITTLESQU;
if (board[row][col]!= '.')
{
int t = board[row][col] - '0';
if (nine[t])
return false;
else
nine[t] = 1;
}
}
nine.clear();
nine.resize(SQUARENUM+1, 0);
}
return true;
}
};

下面是leetcode上的，以空间的代价换取代码更加简洁，很好的思路：

http://discuss.leetcode.com/questions/215/valid-sudoku

class Solution {
public:
bool isValidSudoku(vector<vector<char> > &board)
{
vector<vector<bool> > rows(9, vector<bool>(9, false));
vector<vector<bool> > cols(9, vector<bool>(9, false));
vector<vector<bool> > blocks(9, vector<bool>(9, false));

for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] == '.') continue;
int c = board[i][j] - '1';
if (rows[i][c] || cols[j][c] || blocks[i - i % 3 + j / 3][c])
return false;
rows[i][c] = cols[j][c] = blocks[i - i % 3 + j / 3][c] = true;
}
}
return true;
}
};

省空间的简洁代码：

//2014-1-26
bool isValidSudoku(vector<vector<char> > &board)
{
vector<bool> row_table(9);
vector<bool> col_table(9);
vector<bool> squ_table(9);
for (int i = 0; i < 9; i++)
{
row_table.clear(); row_table.resize(9);
col_table.clear(); col_table.resize(9);
squ_table.clear(); squ_table.resize(9);
for (int j = 0; j < 9; j++)
{
if (board[i][j] != '.')
{
int r = board[i][j] - '1';
if (!row_table[r]) row_table[r] = true;
else return false;
}
if (board[j][i] != '.')
{
int c = board[j][i] - '1';
if (!col_table[c]) col_table[c] = true;
else return false;
}
int r = i/3*3+j/3, c = i%3*3+j%3;
if (board[r][c] != '.')
{
int sq = board[r][c] - '1';
if (!squ_table[sq]) squ_table[sq] = true;
else return false;
}
}
}
return true;
}

## [LeetCode] 036. Valid Sudoku (Easy) (C++)

[LeetCode] 036. Valid Sudoku (Easy) (C++)
• hcbbt
• 2015年03月13日 19:13
• 1558

## LeetCode Valid Sudoku数独有效性验证

• kenden23
• 2013年12月04日 08:19
• 4056

## leetcode题解-36.Valid Sudoku

• liuchonge
• 2016年07月15日 16:37
• 383

## LeetCode 36. Valid Sudoku（数独游戏）

• jmspan
• 2016年05月20日 10:38
• 364

## LeetCode-36. Valid Sudoku (JAVA)（有效数独）

LeetCode-36. Valid Sudoku (JAVA)（有效数独）
• mine_song
• 2017年04月17日 09:25
• 448

## 本博客LeetCode题解索引及各类算法问题小结汇总（C++实现）

Some explains： 1),The current problems have been solved：Welcome, EbowTang! You have solved 101 / 316...
• EbowTang
• 2016年02月15日 17:18
• 5668

## LeetCode-分类题解

https://github.com/soulmachine/leetcode/raw/master/C%2B%2B/leetcode-cpp.pdf 原作者：戴方勤(soulmachine@gma...
• skp127
• 2016年07月03日 14:53
• 1063

## LeetCode 36 Valid Sudoku（有效数独）

• NoMasp
• 2015年11月30日 20:58
• 3395

## 【LeetCode-面试算法经典-Java实现】【036-Valid Sudoku（验证数独棋盘）】

【036-Valid Sudoku（验证数独棋盘）】】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题　　Determine if a Sudoku is valid, acc...
• DERRANTCM
• 2015年07月27日 07:21
• 3570

## LeetCode 题目总结/分类

• yangliuy
• 2015年03月21日 11:29
• 7539

举报原因： 您举报文章：LeetCode Valid Sudoku数独有效性验证 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)