Leetcode dfs Sudoku Solver

Sudoku Solver

  Total Accepted: 11799  Total Submissions: 56732 My Submissions

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.



题意:填充数独,返回是否填充成功
思路:dfs
找一个还没填充的位置,尝试填写0-9其中的一个数字,判断是否理。
如果合理,则可以转移到一个同样子问题,所以可以采用递归的方式实现。
bool solveSudoku(vector<vector<char> >&board)
返回是否成功填充当前状态为 board的数独


bool isValid(const vector<vector<char> >&board, int x, int y){
	//检查行
	for(int j = 0; j < 9; ++j) if(j != y && board[x][j] == board[x][y]) return false;
	//检查列
	for(int i = 0; i < 9; ++i) if(i != x && board[i][y] == board[x][y]) return false;
	//检查小方块
	for(int i = 0; i < 3; ++i)
		for(int j = 0; j < 3; ++j){
			if(!(x/3 * 3 + i == x && y /3 * 3 + j == y) && board[x/3 * 3 + i][y /3 * 3 + j] == board[x][y]) return false;
		}
	return true;
}


bool solveSudoku(vector<vector<char> >&board)
{
	for(int i = 0; i < 9;  ++i){
		for(int j = 0; j < 9; ++j){
			if(board[i][j] == '.'){
				for(int k = 0; k < 9; ++k){
					board[i][j] = k + '1' ;
					if(isValid(board, i, j) && solveSudoku(board)) return true;
					board[i][j] = '.';
				}
				return false;
			}
		}
	}
	return true; //漏写了这句,WA了好多次
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值