Java for LeetCode 037 Sudoku Solver

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.

解题思路:

经典的NP问题,采用Dancing Links可以优化算法,参考链接:https://www.ocf.berkeley.edu/~jchu/publicportal/sudoku/sudoku.paper.html

本题方法多多,优化算法也是多多,本例仅给出最简单的DFS暴力枚举算法。

JAVA实现如下:

 

static public void solveSudoku(char[][] board) {
		int count = 0;
		for (int i = 0; i < board.length; i++)
			for (int j = 0; j < board[0].length; j++)
				if (board[i][j] == '.')
					count++;
		dfs(board, count);
	}

	public static int dfs(char[][] board, int count) {
		if (count == 0)
			return 0;
		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board[0].length; j++) {
				if (board[i][j] == '.') {
					for (int k = 1; k <= 10; k++) {
						if (k == 10)
							return count;
						board[i][j] = (char) ('0' + k);
						if (!isValid(board, i, j))
							board[i][j] = '.';
						else {
							count--;
							count = dfs(board, count);
							if (count == 0)
								return count;
							count++;
							board[i][j] = '.';
						}
					}
				}
			}
		}
		return count;
	}

	static public boolean isValid(char[][] board, int row, int col) {
		HashMap<Character, Integer> hashmap = new HashMap<Character, Integer>();
		for (int j = 0; j < board[0].length; j++) {
			if (board[row][j] != '.') {
				if (hashmap.containsKey(board[row][j]))
					return false;
				hashmap.put(board[row][j], 1);
			}
		}

		hashmap = new HashMap<Character, Integer>();
		for (int i = 0; i < board.length; i++) {
			if (board[i][col] != '.') {
				if (hashmap.containsKey(board[i][col]))
					return false;
				hashmap.put(board[i][col], 1);
			}
		}

		hashmap = new HashMap<Character, Integer>();
		int rowTemp = (row / 3) * 3;
		int colTemp = (col / 3) * 3;

		for (int k = 0; k < 9; k++) {
			if (board[rowTemp + k / 3][colTemp + k % 3] != '.') {
				if (hashmap
						.containsKey(board[rowTemp + k / 3][colTemp + k % 3]))
					return false;
				hashmap.put(board[rowTemp + k / 3][colTemp + k % 3], 1);
			}
		}
		return true;
	}

 

posted @ 2015-05-08 20:02  TonyLuis  阅读(1346)  评论(0编辑  收藏  举报