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;
		
	}














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值