zoukankan      html  css  js  c++  java
  • Leetcode Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells.

    Empty cells are indicated by the character '.'.

    You may assume that there will be only one unique solution.

    A sudoku puzzle...

    遇到九宫格问题一般都深搜解决

    class Solution {
    public:
        bool isValidRow(int row , vector<vector<char> >& board){
            vector<int> cnt(10,0);
            for(int col = 0; col < 9; ++ col){
                char item = board[row][col];
                if(item != '.'){
                    if(cnt[item-'0']!=0) return false;
                    else cnt[item-'0']++;
                }
            }
            return true;
        }
        
        bool isValidCol(int col, vector<vector<char> >& board ){
            vector<int> cnt(10,0);
            for(int row = 0; row < 9; ++ row){
                char item = board[row][col];
                if(item != '.'){
                    if(cnt[item-'0']!=0) return false;
                    else cnt[item-'0']++;
                }
            }
            return true;
        }
        
        bool isValidBox(int i,int j, vector<vector<char> >& board){
            vector<int> cnt(10,0);
            for(int row = 3*i;row < 3*i+3; ++row){
                for(int col = 3*j; col < 3*j+3; ++col){
                    char item = board[row][col];
                    if(item != '.'){
                        if(cnt[item-'0']!=0) return false;
                        else cnt[item-'0']++;
                    }
                }
            }
            return true;
        }
    
        bool isValidSudoku(int x, int y,vector<vector<char> > &board) {
            return isValidRow(x,board)&&isValidCol(y,board)&&isValidBox(x/3,y/3,board);
        }
        
        bool dfs(int pos ,vector<vector<char> >& board){
            int n = board.size();
            if(pos == n*n) return true;
            int x = pos/n, y = pos%n;
            if(board[x][y]=='.'){
                for(char i = '1'; i<='9';++ i){
                    board[x][y]=i;
                    if(isValidSudoku(x,y,board) && dfs(pos+1,board)) return true;
                    board[x][y]='.';
                }
            }else{
                if(dfs(pos+1,board)) return true;
            }
            return false;
        }
        
        void solveSudoku(vector<vector<char> > &board) {
            dfs(0,board);
        }
    };
  • 相关阅读:
    十个 PHP 开发者最容易犯的错误
    PHP 引用是个坑,请慎用
    Laravel 模型事件入门
    PHP 设计模式阅读清单
    《PHP 设计模式》翻译完毕
    数据库分库分表(sharding)系列(一) 拆分规则
    数据库Sharding的基本思想和切分策略
    学习JVM GarbageCollection
    数据库为什么要分库分表
    vue2.0 父子组件通信 兄弟组件通信
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3830465.html
Copyright © 2011-2022 走看看