zoukankan      html  css  js  c++  java
  • 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);
        }
    };
  • 相关阅读:
    Hibernate关联映射
    mysql 外键约束
    巩固JavaSE基础--IDEA完成实战项目
    PHP--选择排序
    PHP--冒泡排序
    vscode调试单个PHP脚本文件
    Vscode下调试基于Homestead环境的Laravel框架
    Python Web开发
    Python之UDP编程
    Python之TCP编程
  • 原文地址:https://www.cnblogs.com/tonix/p/3915954.html
Copyright © 2011-2022 走看看