首页 > 编程语言 > 详细

Java [leetcode 37]Sudoku Solver

时间:2015-11-16 22:39:45      阅读:277      评论:0      收藏:0      [点我收藏+]

题目描述:

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character ‘.‘.

You may assume that there will be only one unique solution.

技术分享

A sudoku puzzle...

技术分享

...and its solution numbers marked in red.

解题思路:

本题使用回溯和HashSet的方法。对于每一个空白位置,试探的使用‘1’-‘9’之间的数字,如果加入该数字在满足数独规则的情况下,将该字符加入该位置,向下去试探;如果试探失败,则回到当前这步,换另一个字符继续进行试探。

代码如下:

public class Solution {
    public void solveSudoku(char[][] board) {
		HashSet[] row = new HashSet[9];
		HashSet[] col = new HashSet[9];
		HashSet[] cell = new HashSet[9];
		initHashSet(board, row, col, cell);
		solve(board, row, col, cell);
	}

	public boolean solve(char[][] board, HashSet[] row, HashSet[] col,
			HashSet[] cell) {
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				if (board[i][j] == ‘.‘) {
					for (char c = ‘1‘; c <= ‘9‘; c++) {
						if (isValidSudoku(board, i, j, c, row, col, cell)) {
							board[i][j] = c;
							row[i].add(c);
							col[j].add(c);
							cell[3 * (i / 3) + j / 3].add(c);
							if (solve(board, row, col, cell))
								return true;
							else {
								board[i][j] = ‘.‘;
								row[i].remove(c);
								col[j].remove(c);
								cell[3 * (i / 3) + j / 3].remove(c);
							}
						}
					}
					return false;
				}
			}
		}
		return true;
	}

	public boolean isValidSudoku(char[][] board, int i, int j, char c,
			HashSet[] row, HashSet[] col, HashSet[] cell) {
		if (row[i].contains(c) || col[j].contains(c)
				|| cell[3 * (i / 3) + j / 3].contains(c))
			return false;
		return true;

	}

	public void initHashSet(char[][] board, HashSet[] row,
			HashSet[] col, HashSet[] cell) {
		for (int i = 0; i < 9; i++) {
			row[i] = new HashSet<Character>();
			col[i] = new HashSet<Character>();
			cell[i] = new HashSet<Character>();
		}
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				if (board[i][j] != ‘.‘) {
					row[i].add(board[i][j]);
					col[j].add(board[i][j]);
					cell[3 * (i / 3) + j / 3].add(board[i][j]);
				}
			}
		}
	}
}

 

Java [leetcode 37]Sudoku Solver

原文:http://www.cnblogs.com/zihaowang/p/4970069.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!