70. 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.

分析:题目要求是分析给定的二维数组是否为可解的数独棋盘。这就要求:1.每行出现的1-9的数字不能重复;2.每列出现的1-9的数字不能重复;3.每宫内出现的1-9的数字不能重复。

	/** 符合条件的数独是满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 
	 *  判断一个目前的数独是否可解,只需要满足每一行、每一列和每一个宫内的元素不重复即可。
	 */
	public boolean isValidSudoku(char[][] board) {
		Set rowSet = new HashSet();/* 当前行集合 */
		Set columnSet = new HashSet();/* 当前列集合 */
		/*Step1:先判断某行某列是否不重复*/
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				if (board[i][j] != '.') {
					if (rowSet.contains(board[i][j])) {/* 包含重复元素则返回false */
						return false;
					} else {
						rowSet.add(board[i][j]);
					}
				}
				if (board[j][i] != '.') {
					if (columnSet.contains(board[j][i])) {
						return false;
					} else {
						columnSet.add(board[j][i]);
					}
				}
			}
			/* 如果需要继续下一个循环的话,则应该清空这两个集合 */
			rowSet.clear();
			columnSet.clear();
		}
		Set roomSet = new HashSet();/* 当前行集合 */
		/*Step2:判断每个宫内元素是否不重复*/
		for(int i=0;i<9;i=i+3){
			for(int j = 0;j<9;j=j+3){
				for(int row=i;row<i+3;row++){
					for(int col=j;col<j+3;col++){
						if (board[row][col] != '.') {
							if (roomSet.contains(board[row][col])) {/* 包含重复元素则返回false */
								return false;
							} else {
								roomSet.add(board[row][col]);
							}
						}
					}
					}
				roomSet.clear();//计算下一宫的元素之前,把这一个宫内的元素清0
				}
		}
		return true;
	}

你可能感兴趣的:(70. Valid Sudoku)