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);
        }
    };
  • 相关阅读:
    微信支付v2开发(11) Native支付
    微信公众平台开发(103) 四六级成绩查询
    教爸爸妈妈用微信
    微信支付开发(12) 认清微信支付v2和v3
    微信公众平台卡券功能
    用网页 实现断点续传 (HTTP)
    用SpringBoot 实现断点续传 (HTTP)
    用SpringMVC 实现断点续传 (HTTP)
    用vue 实现断点续传 (HTTP)
    用html5 实现断点续传 (HTTP)
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3830465.html
Copyright © 2011-2022 走看看