leetcode37 解数独

leetcode37 解数独

还是常规的回溯,这题理论上可以通过不少方式剪枝,这里都没有考虑。

需要注意的是,Java数组clone,一维数组是深拷贝,多维数组是浅拷贝,这里二维数组用clone实际上会得到同一个对象。

代码:

class Solution {

    char[][] res = new char[9][9];

    private boolean check(char[][] board,int r,int c){
        int rs = (r/3)*3;
        int cs = (c/3)*3;
        for(int j = 0;j < 9;j++){
            if(j == c) continue;
            if(board[r][c] == board[r][j]) return false;
        }
        for(int i = 0;i < 9;i++){
            if(i == r) continue;
            if(board[r][c] == board[i][c]) return false;
        }
        for(int i = rs;i < rs+3;i++){
            for(int j = cs;j < cs+3;j++){
                if(r == i && c == j) continue;
                if(board[r][c] == board[i][j]) return false;
            }
        }
        return true;
    }

    private void trackBack(char[][] board,int r,int c){
        if(r >= 9){
            for(int i = 0;i < 9;i++){
                for(int j = 0;j < 9;j++)
                    res[i][j] = board[i][j];
            }
        }else{
            if(board[r][c] != '.'){
                int cnext = c+1 >= 9 ? 0 : c+1;
                int rnext = c+1 >= 9 ? r+1 : r;
                trackBack(board, rnext, cnext);

            }else{
                for(int i = 1;i <= 9;i++){
                    board[r][c] = (char) (i + 48);
                    if(check(board, r, c)){
                        int cnext = c+1 >= 9 ? 0 : c+1;
                        int rnext = c+1 >= 9 ? r+1 : r;
                        trackBack(board, rnext, cnext);
                    }
                    board[r][c] = '.';
                }
            }
        }
    }

    public void solveSudoku(char[][] board) {
        trackBack(board, 0, 0);
        for(int i = 0;i < 9;i++){
            for(int j = 0;j < 9;j++)
                board[i][j] = res[i][j];
        }
    }
}

17ms 35.6MB

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值