LeetCode36——Valid Sudoku

本文介绍了一种通过检查行、列及3x3宫格来验证数独是否有效的算法实现。利用C++编程语言,通过map数据结构判断每行、每列及每个小宫格内的数字是否有重复。

LeetCode36——Valid Sudoku


题意:

判断数独是否符合,也就是每行,每列,每个3X3的九宫格。比起下一题完成数独,判断起来就简单多了:

思路就是,按行,按列,按3X3的九宫格分别判断,最后的结果是三者的与的结果,这样写起来代码量比较多但是思路还是比较清晰的。


代码:

class Solution {
private:
	bool ValidRow(vector< vector<char> >&board)//对行判断
	{
		map<char, int>myMap;
		for (int i = 0; i < 9; i++)
		{
			vector<char> oneRow(board[i]);//存储第i行数据
			for (int j = 0; j < 9; j++)
			{
				if (oneRow[j] == '.')
					continue;
				else
				{
					if (myMap.find(oneRow[j]) != myMap.end())//如果出现同样的数字则立刻返回false
						return false;
					else
						myMap[oneRow[j]] = 1;
				}
			}
			myMap.clear();
			oneRow.clear();
		}
		return true;
	}
	bool ValidCol(vector< vector<char> >&board)//对每列进行判断
	{
		map<char, int>myMap;
		for (int i = 0; i < 9; i++)
		{
			vector<char>oneCol;
			for (int j = 0; j < 9; j++)
			{
				oneCol.push_back(board[j][i]);//第i列
			}
			for (int k = 0; k < 9; k++)
			{
				if (oneCol[k] == '.')
					continue;
				else
				{
					if (myMap.find(oneCol[k]) != myMap.end())//如果有重复立刻返回
						return false;
					else
						myMap[oneCol[k]] = 1;
				}
			}
			myMap.clear();
			oneCol.clear();
		}
		return true;
	}
	bool ValidMatrix(vector< vector<char> >&board)//判断每个3X3的九宫格
	{
		
		map<char, int>myMap;
		vector<char>oneMatrix;
		//九宫格按照从左往右从上往下的顺序
		for (int k = 0; k < 9; k++)
		{
			for (int i = 0; i < 3; i++)
			{
				for (int j = 0; j < 3; j++)
				{
					oneMatrix.push_back(board[i + (k / 3) * 3][j + (k % 3) * 3]);
				}
			}


			for (int l = 0; l < 9; l++)
			{
				if (oneMatrix[l] == '.')
					continue;
				else
				{
					if (myMap.find(oneMatrix[l]) != myMap.end())//出现重复数字立刻返回false
						return false;
					else
						myMap[oneMatrix[l]] = 1;
				}
			}
			oneMatrix.clear();
			myMap.clear();
		}
		return true;
	}
public:
	bool isValidSudoku(vector<vector<char>>& board) {
		return ValidCol(board) && ValidMatrix(board) && ValidRow(board);
	}
};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值