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);
        }
    };
  • 相关阅读:
    SQL SERVER 2012修改数据库名称(包括 db.mdf 名称的修改)
    vmware三种网络模式
    指针
    linux 中 开放端口,以及防火墙的相关命令
    数据库备份的脚本,记录下,还需优化下
    遍历 目录的几种有效办法
    转。git 乌龟的使用安装
    centos 时区正确,时间不对
    locate
    从 零开始 无差错 装好nginx+PHP
  • 原文地址:https://www.cnblogs.com/tonix/p/3915954.html
Copyright © 2011-2022 走看看