• 37. Sudoku Solver *HARD*


    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.

    const int SodukuSize = 9;
    bool row_mask[SodukuSize][SodukuSize];
    bool col_mask[SodukuSize][SodukuSize];
    bool area_mask[SodukuSize][SodukuSize];
    
    bool initSudokuMask(vector< vector<char> > &board){
        //reset the memory
        memset(row_mask, false, sizeof(row_mask));
        memset(col_mask, false, sizeof(col_mask));
        memset(area_mask, false, sizeof(area_mask));
    
        //check each rows and cols
        for(int r=0; r<board.size(); r++){
            for (int c=0; c<board[r].size(); c++){
                if (!isdigit(board[r][c])) {
                    continue;
                };
                int idx =  board[r][c] - '0' - 1;
    
                //check the rows/cols/areas
                int area = (r/3) * 3 + (c/3);
                if (row_mask[r][idx] || col_mask[c][idx] || area_mask[area][idx] ){
                    return false;
                }
                row_mask[r][idx] = col_mask[c][idx] = area_mask[area][idx] = true;
            }
        }
        return true;
    }
    
    
    bool recursiveSudoKu(vector< vector<char> > &board, int row, int col){
    
        if (row >= SodukuSize) {
            return true;
        }
    
        if (col >= SodukuSize){
            return recursiveSudoKu(board, row+1, 0);
        }
        
        if (board[row][col] != '.'){
            return recursiveSudoKu(board, row, col+1);    
        }
        //pick a number for empty cell
        int area;
        for(int i=0; i<SodukuSize; i++){
            area = (row/3) * 3 + (col/3);
            if (row_mask[row][i] || col_mask[col][i] || area_mask[area][i] ){
                continue;
            }
            //set the number and sovle it recursively
            board[row][col] = i + '1';
            row_mask[row][i] = col_mask[col][i] = area_mask[area][i] = true;
            if (recursiveSudoKu(board, row, col+1) == true){
                return true;
            }
            //backtrace
            board[row][col] = '.';
            row_mask[row][i] = col_mask[col][i] = area_mask[area][i] = false;
        }
        return false;
    }
  • 相关阅读:
    腾讯2017暑期实习编程题3
    腾讯2017暑期实习编程题2
    腾讯2017暑期实习编程题1
    力扣算法题—098验证二叉搜索树
    题目1451:不容易系列之一
    题目1362:左旋转字符串(Move!Move!!Move!!!)
    HDU 2564 词组缩写
    HDU 2561 二小整数
    HDU 2034 人见人爱A-B
    HDU 1875 畅通工程再续
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5245095.html
Copyright © 2020-2023  润新知