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


 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值