初级算法 数组 十、有效的数独

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

上图是一个部分填充的有效的数独。

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例 :

输入:
[
  ["5","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
]
输出: true
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
	bool isValidSudoku(vector<vector<char>>& board) {
		int count = 0;
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				for (int n = j; n < 8; n++) {
					if (board[i][j] != board[i][n + 1] || board[i][j] == '.') {
						count++;
					}
					else {
						return 0;
					}
				}
				for (int m = i; m < 8; m++) {
					if (board[i][j] != board[m + 1][j] || board[i][j] == '.') {
						count++;
					}
					else {
						return 0;
					}
				}
			}
		}
		for (int i = 0; i < 9; i += 3) {
			for (int j = 0; j < 9; j += 3) {
				int map[10] = {0};
				for (int k = i; k < i + 3; k++) {
					for (int l = j; l < j + 3; l++) {
						if (board[k][l] == '.') {
							count++;
							continue;
						}
						int num = board[k][l] - '0';
						if (map[num] == 1)return false;
						map[num] = 1;
						count++;
					}
				}
			}
		}
		if (count == 729) {
			return 1;
		}
		else {
			return 0;
		}
	}
};
int main() {
	Solution ans;
	vector<vector<char>> m = { 
		{ '5','3','.','.','7','.','.','.','.' },
		{ '6','.','.','1','9','5','.','.','.' },
		{ '.','9','8','.','.','.','.','6','.' },
		{ '8','.','.','.','6','.','.','.','3' },
		{ '4','.','.','8','.','3','.','.','1' },
		{ '7','.','.','.','2','.','.','.','6' },
		{ '.','6','.','.','.','.','2','8','.' },
		{ '.','.','.','4','1','9','.','.','5' },
		{ '.','.','.','.','8','.','.','7','9' } };
	cout << ans.isValidSudoku(m) << endl;
	system("pause");
	return 0;
}

 参考:https://blog.csdn.net/runningtortoises/article/details/45830627

猜你喜欢

转载自blog.csdn.net/weixin_42094220/article/details/81586070