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.


A sudoku puzzle...


...and its solution numbers marked in red.

解题思路:

使用回溯的方法,对每一个小格子的每一种可能性进行试探


private int[][] rowValid;//表示第i行数字j是否已经使用
	private int[][] colValid;//表示第i列数字j是否已经使用
	private int[][] subBoxValid;//表示第i个小格子数字j是否已经使用
	public void solveSudoku(char[][] board) {
		rowValid = new int[9][10];
		colValid = new int[9][10];
		subBoxValid = new int[9][10];
		for(int i=0; i<9; i++)
			for(int j=0; j<9; j++)
				if(board[i][j] != '.') {
					fill(i, j, board[i][j]-'0');
				}
		solveSudoKuImpl(board, 0);
    }
	
	private boolean solveSudoKuImpl(char[][] board, int index) {
		//当前填充到第index个格子
		if(index>80)
			return true;
		int i = index/9;//行号
		int j = index - i*9;//列号
		if(board[i][j] != '.')
			return solveSudoKuImpl(board, index+1);
		for(char val='1'; val<='9'; val++) {//试探每一种可能性
			if(isValid(i, j, val-'0')) {
				board[i][j] = val;	//进行填充
				fill(i, j, val-'0');
				if(solveSudoKuImpl(board, index+1)) return true;//继续填充下一个格子
				clear(i, j, val-'0');//当前数字不符合要求,清除状态,进行回溯
			}
		}
		board[i][j] = '.';//都不符合要求,回复起始状态
		return false;
	}
	//判断第row行,第col列填充val是否符合要求
	private boolean isValid(int row, int col, int val) {
		if(rowValid[row][val] == 0 &&
			colValid[col][val] == 0 &&
			subBoxValid[(row/3)*3+col/3][val] == 0 ) {
			return true;
		}
		return false;
	}

	//更新填充状态
	private void fill(int row, int col, int val) {
		rowValid[row][val] = 1;
		colValid[col][val] = 1;
		subBoxValid[(row/3)*3+col/3][val] = 1;
		
	}
	//清除填充状态
	private void clear(int row, int col, int val) {
		rowValid[row][val] = 0;
		colValid[col][val] = 0;
		subBoxValid[(row/3)*3+col/3][val] = 0;
		
	}














你可能感兴趣的:(Sudoku Solver)