首页 > 其他 > 详细

LeetCode | Sudoku Solver

时间:2014-04-05 12:25:26      阅读:530      评论: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.

bubuko.com,布布扣

A sudoku puzzle...

bubuko.com,布布扣

...and its solution numbers marked in red.

分析

递归的方法,根据数独规则剪枝。

代码

public class SudokuSolver {
	int N;
	int subSize;
	char[][] board;

	public void solveSudoku(char[][] board) {
		this.board = board;
		N = board.length;
		subSize = (int) Math.sqrt(N);
		solve(0);
	}

	private boolean solve(int index) {
		if (index == N * N) {
			return true;
		}
		int x = index / N;
		int y = index % N;
		if (board[x][y] == ‘.‘) {
			for (char c = ‘1‘; c <= ‘9‘; ++c) {
				if (isValidCell(x, y, c)) {
					board[x][y] = c;
					if (solve(index + 1)) {
						return true;
					}
					board[x][y] = ‘.‘;
				}
			}
		} else {
			return solve(index + 1);
		}
		return false;
	}

	private boolean isValidCell(int x, int y, char c) {
		// row
		for (int column = 0; column < N; ++column) {
			if (board[x][column] == c) {
				return false;
			}
		}

		// column
		for (int row = 0; row < N; ++row) {
			if (board[row][y] == c) {
				return false;
			}
		}

		// subboard
		int originRow = (x / subSize) * subSize;
		int originColumn = (y / subSize) * subSize;
		for (int i = 0; i < N; ++i) {
			int row = originRow + i / subSize;
			int column = originColumn + i % subSize;
			if (board[row][column] == c) {
				return false;
			}
		}
		return true;
	}
}

LeetCode | Sudoku Solver,布布扣,bubuko.com

LeetCode | Sudoku Solver

原文:http://blog.csdn.net/perfect8886/article/details/22979703

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