Sudoku Solver : 53 lines and 12 ms

class Solution {
public:
    bool helper(int r, int c, int mpRow[][9], int mpCol[][9], int mpGroup[][9], vector<vector<char> >& board) {
		if (r >= 9) {
			return true;
		}
		if (c >= 9){
			c = 0;
			if (helper(r+1, c, mpRow, mpCol, mpGroup, board)) 
				return true;
			return false;
		}
		if (board[r][c] != '.'){
			if (helper(r, c+1, mpRow, mpCol, mpGroup, board)) 
				return true;  
			return false;
		}
		for (int i = 0; i < 9; ++ i) {
			int are = r/3*3+c/3;
			if (board[r][c] == '.' && isValidNum(mpRow[r], mpCol[c], mpGroup[are], i)) {
				board[r][c] = '1' + i;
				mpRow[r][i] = mpCol[c][i] = mpGroup[are][i] = 1;
				if (helper(r, c+1, mpRow, mpCol, mpGroup, board))
					return true;
				board[r][c] = '.';
				mpRow[r][i] = mpCol[c][i] = mpGroup[are][i] = 0;
			}
		}
		return false;
    }
    
    bool isValidNum(int *mpRow, int *mpCol, int *mpGroup, int num) {
        if (mpRow[num] == 0 && mpCol[num] == 0 && mpGroup[num] == 0)
            return true;
        return false;
    }
    
    void solveSudoku(vector<vector<char> >& board) {
        int mpRow[9][9] = {{0}};
        int mpCol[9][9] = {{0}};
        int mpGroup[9][9] = {{0}};
        for (int i = 0; i < 9; ++ i) {
            for (int j = 0; j < 9; ++ j) {
                char c = board[i][j];
                if (c == '.')
                    continue;
                mpRow[i][c-'1'] = 1;
                mpCol[j][c-'1'] = 1;
                mpGroup[i/3*3+j/3][c-'1'] = 1;
            }
        }
		helper(0, 0, mpRow, mpCol, mpGroup, board);
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值