zoukankan      html  css  js  c++  java
  • 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;
        }
    
    };
  • 相关阅读:
    express中session的基本使用
    MongoDB 索引 和 explain 的使用
    MongoDB 数据库创建删除、表(集合) 创建删除、数据增删改查
    node fs模块
    k30s刷入国际rom
    基于webpack项目的全局变量
    nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
    html手写板
    vue常用配置
    vue组件库从创建到发行和使用
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4856984.html
Copyright © 2011-2022 走看看