• LeetCode "Sudoku Solver"


    Simply DFS + Backtrace, as N-Queen

    class Solution {
    public:
        vector<unordered_set<char>> rows;
        vector<unordered_set<char>> cols;
        vector<vector<unordered_set<char>>> subboxHm;
    
        bool isValid(char c, int i, int j)
        {
            return (rows[j].find(c) == rows[j].end() &&
                    cols[i].find(c) == cols[i].end() &&
                    subboxHm[j/3][i/3].find(c) == subboxHm[j/3][i/3].end());
        }
        void putRecord(char c, int i, int j, vector<vector<char> > &board)
        {
            board[j][i] = c;
            rows[j].insert(c);
            cols[i].insert(c);
            subboxHm[j/3][i/3].insert(c);
        }
        void clearRecord(char c, int i, int j, vector<vector<char> > &board)
        {
            board[j][i] = '.';
            rows[j].erase(c);
            cols[i].erase(c);
            subboxHm[j/3][i/3].erase(c);
        }
        bool goDFS(vector<vector<char> > &board)
        {
            size_t cnt = board.size();
            for(int j = 0; j < cnt; j ++)
            for(int i = 0; i < cnt; i ++)
            {
                char c = board[j][i];
                if (c == '.')
                {
                    for(char c = '1'; c <= '9'; c ++)
                    {
                        if(isValid(c, i, j))
                        {                        
                            putRecord(c, i, j, board);
                            if(goDFS(board))    return true;
                            else                clearRecord(c, i, j, board);
                        }
                    }
                    return false;
                }
            }
            return true;
        }
        void solveSudoku(vector<vector<char> > &board) {
            size_t cnt = board.size();
            //    Init
            rows.resize(cnt);
            cols.resize(cnt);
            subboxHm.resize(cnt/3);
            for(int i = 0; i < cnt/3; i ++)
                subboxHm[i].resize(cnt/3);
            
            //    Fill in original record
            for(int j = 0; j < cnt; j ++)
            for(int i = 0; i < cnt; i ++)
            {
                char c = board[j][i];
                if (c != '.')
                {
                    rows[j].insert(c);
                    cols[i].insert(c);
                    unordered_set<char> &sb = subboxHm[j/3][i/3];
                    sb.insert(c);
                }
            }
    
            goDFS(board);
        }
    };
  • 相关阅读:
    2014.7建兰NOIP模拟Day1 Running
    简单的数论函数模板
    二分图匹配的匈牙利算法
    手算平方根
    ...
    hdu 5396 Expression(区间DP+组合数)
    hdu 5693 D Game(区间DP)
    hdu 5151 Sit sit sit(区间dp+排列组合)
    hdu 4570 Multi-bit Trie(dp)
    hdu 2855 Fibonacci Check-up (矩阵)
  • 原文地址:https://www.cnblogs.com/tonix/p/3915954.html
Copyright © 2020-2023  润新知