LeetCode 37 Sudoku Solver-深搜dfs问题

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.

Runtime:  12 ms beats 84%

	public void solveSudoku(char[][] board) {
		dfs(board,0);
	}
	private boolean dfs(char[][] board, int d) {
		if (d==81) return true; //found solution
		int i=d/9, j=d%9;
		if (board[i][j]!='.') return dfs(board,d+1);//prefill number skip

		boolean[] flag=new boolean[10];
		validate(board,i,j,flag);
		for (int k=1; k<=9; k++) {
			if (flag[k]) {
				board[i][j]=(char)('0'+k);
				if (dfs(board,d+1)) return true;
			}
		}
		board[i][j]='.'; //if can not solve, in the wrong path, change back to '.' and out
		return false;
	}
	private void validate(char[][] board, int i, int j, boolean[] flag) {
		Arrays.fill(flag,true);
		for (int k=0; k<9; k++) {
			if (board[i][k]!='.') flag[board[i][k]-'0']=false;
			if (board[k][j]!='.') flag[board[k][j]-'0']=false;
			int r=i/3*3+k/3;
			int c=j/3*3+k%3;
			if (board[r][c]!='.') flag[board[r][c]-'0']=false;
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值