• 37. Sudoku Solver (Array;Back-Track)


    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...

    ...and its solution numbers marked in red.

    class Solution {
    public:
        void solveSudoku(vector<vector<char>> &board) {
            int line=0,column=-1;
            findNextEmpty(board,line,column);
            backtracking(board,line,column);
        }
        
        bool backtracking(vector<vector<char>> &board,int line, int column)
        {
            int i=line, j = column;
            for(int k = 1; k<=9; k++)
            {
                if(!isValid(board,line,column,k+'0')) continue;
                board[line][column] = k+'0';
                
                if(!findNextEmpty(board,line,column)) return true; //if no empty cell is found
                if(backtracking(board,line,column)) return true;
                
                //backTracking
                line = i;
                column = j;
            }
            
            //backTracking
            board[line][column] = '.';
            return false; //if no valid number is found
        }
    
        //为回溯法写一个独立的check函数
        bool isValid(vector<vector<char>> &board, int line, int column, char value)
        {
            //check九宫格的一个格
            int upperBoard = line/3 * 3;
            int leftBoard = column/3 * 3;
            for(int i = 0; i<3; i++)
            {
                for(int j = 0; j<3; j++)
                {
                    if(board[upperBoard+i][leftBoard+j] == value) return false;
                }
            }
         
            //check 列
            for(int i = 0; i<9; i++)
            {
                if(board[line][i] == value) return false;
            }
            
            //check行
            for(int i = 0; i<9; i++)
            {
                if(board[i][column] == value) return false;
            }
            return true;
        }
        
        bool findNextEmpty(vector<vector<char>> &board, int &line, int &column){
            int i,j;
            for(j = column+1; j < 9; j++){
                if(board[line][j]!='.') continue;
                
                column=j;
                return true;
            }
            
            for(i = line+1; i < 9; i++){
                for(j = 0; j < 9; j++){
                    if(board[i][j]!='.') continue;
                
                    line = i;
                    column=j;
                    return true;
                }
            }
            
            return false;
        }
    
    };
  • 相关阅读:
    模拟105 题解
    模拟104 题解
    模拟103 题解
    模拟102 题解
    python与 Ajax跨域请求
    Django--进阶--中间件的使用
    Django--权限组件
    python 最基本的的单例模型的实现及应用
    Django-数据库访问优化
    Create views of OpenCASCADE objects in the Debugger
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4856984.html
Copyright © 2020-2023  润新知