LeetCode - Sudoku Solver

本文介绍了一种用于解决数独谜题的回溯算法,对比了原生数组和vector在查找重复元素效率上的差异,并详细阐述了算法的具体实现过程。

回溯方法,比较简单。

判定是否有重复元素的时候发现原生数组要比vector效率高不少。


class Solution {
public:
    bool _isValid(vector<vector<char> > &board,int i,int j){
		int tmp[10]={0};
		for(int p=0;p<3;++p){
			for(int q=0;q<3;++q){
				if(board[i+p][j+q]!='.'){
					if(tmp[board[i+p][j+q]-'0']!=0)
						return false;
					else
						++tmp[board[i+p][j+q]-'0'];
				}
			}
		}
		return true;
	}
	bool _isValid2(vector<vector<char> > &board,int i,int j){
		int tmp[10]={0};
		for(int q=0;q<9;++q){
			if(board[i][q]!='.'){
				if(tmp[board[i][q]-'0']!=0)
					return false;
				else
					++tmp[board[i][q]-'0'];
			}
		}
		int tmp2[10]={0};
        for(int p=0;p<9;++p){
			if(board[p][j]!='.'){
				if(tmp2[board[p][j]-'0']!=0)
					return false;
				else
					++tmp2[board[p][j]-'0'];
			}
		}
		if(!_isValid(board,i/3*3,j/3*3))
			return false;
		return true;
	}
    bool _solveSudoku(vector<vector<char> > &board,int i, int j) {
		if(i==9)
			return true;
		int next_i, next_j;
		next_i = (j+1)<9?i:(i+1);
		next_j = (j+1)<9?(j+1):0;
		if(board[i][j]!='.')
			return _solveSudoku(board,next_i,next_j);
		if(board[i][j]=='.'){
			for(char c='1';c<='9';++c){
				board[i][j] = c;
				if(_isValid2(board,i,j)){
					if(_solveSudoku(board,next_i,next_j))
						return true;
				}
				board[i][j]='.';
			}
			return false;
		}
	}
	void solveSudoku(vector<vector<char> > &board) {
		_solveSudoku(board,0,0);
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值