37. Sudoku Solver

1刷
题目也是很简单,判断用了上一题的代码,dfs一次ac!!!!主要是写多了一个小东西一直bug
Else 后面多了东西
还有map<>m[10]这个东西传参解决不了,大神说可以用vector存map,我后来是直接用了全局变量23333333

class Solution {
public:
    bool isOK(vector<vector<char>>& board){
        for(int i = 0; i < 9; ++ i){
            unordered_map<char, bool> mm1;
            unordered_map<char, bool> mm2;
            unordered_map<char, bool> mm3;

            for(int j = 0; j < 9; ++ j){
                if(mm1[board[i][j]] == true)
                    return false;
                mm1[board[i][j]] = true;
                if(mm2[board[j][i]] == true)
                    return false;
                mm2[board[j][i]] = true;
                if(mm3[board[i/3*3+j/3][i%3*3+j%3]] == true)
                    return false;
                mm3[board[i/3*3+j/3][i%3*3+j%3]] = true;
            }
        }
        return true;
    }

    unordered_map<char, bool>m1[9];
    unordered_map<char, bool>m2[9];
    unordered_map<char, bool>m3[9];
    bool numisOK(char t, int i, int j){
        if(m1[i][t] != true && m2[j][t] != true && m3[i/3*3+j/3][t] != true)
            return true;
        return false;
    }

    int f = 1;

    void solveit(vector<vector<char>>& board, int a, int b){
        if(!f) return;
        if(a == 9){
            if(isOK(board)) f = 0;
            return;
        }

        if(board[a][b] != '.'){
            if(b == 8)
                solveit(board, a + 1, 0);
            else 
                solveit(board, a, b + 1);
            return;
        }

        for(int i = 1; i <= 9; ++ i){
            char c = i + 48;
            if(numisOK(c, a, b)){
               m1[a][c] = true;
               m2[b][c] = true;
               m3[a/3*3+b/3][c] = true;
               board[a][b] = c;



               if(b == 8)
                    solveit(board, a + 1, 0);
               else
                    solveit(board, a, b + 1);


               if(!f) return;

               m1[a][c] = false;
               m2[b][c] = false;
               m3[a/3*3+b/3][c] = false;
               board[a][b] = '.';
            }
            else
            continue;
        }
        return;
    }

    void solveSudoku(vector<vector<char>>& board) {

        for(int i = 0; i < 9; ++ i){
            for(int j = 0; j < 9; ++ j){
                if(board[i][j] != '.'){
                    m1[i][board[i][j]] = true;
                    m2[j][board[i][j]] = true;
                    m3[i/3*3+j/3][board[i][j]] = true;
                }
            }
        }

        solveit(board, 0, 0);
    }
};

2刷
没有2刷因为1刷一次就ac了,简单dfs,3刷可以看看一个题解为2ms的代码,自己的代码是116ms,,差了50倍!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值