LeetCode Valid Sudoku数独有效性验证

原创 2013年12月04日 08:19:13

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;
	}


 

 

 

 

 

 

 

版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者允许不得转载。

相关文章推荐

Leetcode #36. Valid Sudoku 数独游戏验证 解题报告

1 解题思想九宫格验证,验证这个数独游戏的棋盘是否合法,这题做的不是求解答案,只是看给定的棋盘是否合法!做法没什么特别的,分块,行,列都要验证,即一个分组单位里1-9有且只能出现一次注意空间优化2 原...

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

【036-Valid Sudoku(验证数独棋盘)】】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Determine if a Sudoku is valid, acc...

[LeetCode] [数独问题] Valid Sudoku

判断一个数独是否是合法的。

leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法

Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sud...

[leetcode]Valid Sudoku(判断有效数独 C语言实现)

Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.The Sudoku bo...

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

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

LeetCode:36. Valid Sudoku,数独是否有效 :

LeetCode:36. Valid Sudoku,数独是否有效 : 描述: Determine if a Sudoku is valid, according to: [Sudoku Puzz...

LeetCode 36 Valid Sudoku(有效数独)

翻译数独板被部分填充,空格部分用'.'来填充。一个部分填充的数组是否有效只需要看其填充的部分即可。原文代码这道题写了一会,错了……因为输入太懒搞了,就直接看了别人写的……class Solution ...
  • NoMasp
  • NoMasp
  • 2015-11-30 20:58
  • 2932

LeetCode OJ 之 Valid Sudoku (数独判断)

题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku boa...

[LeetCode 36&37] Valid Sudoku & Sudoku Solver (数独问题)

题目链接:valid-sudoku import java.util.Arrays; /** * Determine if a Sudoku is valid, according...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)