LeetCode刷题:AddressSanitizer: heap-buffer-overflow问题请教||全局变量和引用传递的区别

在刷 https://leetcode.cn/problems/sudoku-solver/description/ 遇到AddressSanitizer: heap-buffer-overflow的报错。
代码为:

// 本题思路就是简单的回溯
// 注意限制:只有唯一解,限制了棋盘大小为9
class Solution {
public:
    bool rowUsed[9][10];//标记每一行哪些数字用过了
    bool colUsed[9][10];
    bool kuaiUsed[3][3][10];
    vector<vector<char>> res;
    vector<vector<char>> board;
    void getNext(int &row,int &col){
        col++;
        if(col==10){
            row++;
            col = 0;
        }
    }
    void dfs(int row,int col){
        cout<<"------"<<endl;
        if(row ==9){
            res = board;
            return ;
        }
        while(board[row][col]!='.'){
            getNext(row,col);
            if(row ==9){
                res = board;
                return ;
            }
        }
        int nextRow =row;
        int nextCol = col+1;
        if(nextCol == 10){
            nextCol =0;nextRow++;
        }
            //填充当前位置
        for(int num =1; num<=9 ;num++){
            if(rowUsed[row][num]==false&&colUsed[col][num]==false&&kuaiUsed[row/3][col/3][num]==false){
                rowUsed[row][num]=true;
                colUsed[col][num]=true;
                kuaiUsed[row/3][col/3][num]=true;
                board[row][col]='0'+num;
                dfs(nextRow,nextCol);
                board[row][col]='.';
                rowUsed[row][num]=false;
                colUsed[col][num]=false;
                kuaiUsed[row/3][col/3][num]=false;
            }
        }
    }
    void solveSudoku(vector<vector<char>>& board) {
        this->board = board;
        for(int i = 0;i<9;i++){
            for(int j =0;j<9;j++){
                if(board[i][j]!='.'){
                    int num = board[i][j]-'0';
                    rowUsed[i][num]=true;
                    colUsed[j][num]=true;
                    kuaiUsed[i/3][j/3][num]=true;
                }
            }
        }
        dfs(0,0);
        board = this->res;
    }
};

打印发现递归深度也非常浅,只有几层递归。输出如下:

------
------
------
------
------
------
------
------
------
------
------

后来只是简单的将全局变量board,改成引用传递就可以了

// 本题思路就是简单的回溯
// 注意限制:只有唯一解,限制了棋盘大小为9
class Solution {
public:
    bool rowUsed[9][10];//标记每一行哪些数字用过了
    bool colUsed[9][10];
    bool kuaiUsed[3][3][10];
    vector<vector<char>> res;
    void getNext(int &row,int &col){
        col++;
        if(col==10){
            row++;
            col = 0;
        }
    }
    void dfs(int row,int col,vector<vector<char>>& board){
        if(row ==9){
            res = board;
            return ;
        }
        while(board[row][col]!='.'){
            getNext(row,col);
            if(row ==9){
                res = board;
                return ;
            }
        }
        int nextRow =row;
        int nextCol = col+1;
        if(nextCol == 10){
            nextCol =0;nextRow++;
        }
            //填充当前位置
        for(int num =1; num<=9 ;num++){
            // rowUsed[i][num]=true;
            //     colUsed[j][num]=true;
            //     kuaiUsed[i/3][j/3][num]=true;
            if(rowUsed[row][num]==false&&colUsed[col][num]==false&&kuaiUsed[row/3][col/3][num]==false){
                rowUsed[row][num]=true;
                colUsed[col][num]=true;
                kuaiUsed[row/3][col/3][num]=true;
                board[row][col]='0'+num;
                dfs(nextRow,nextCol,board);
                board[row][col]='.';
                rowUsed[row][num]=false;
                colUsed[col][num]=false;
                kuaiUsed[row/3][col/3][num]=false;
            }
        }
    }
    void solveSudoku(vector<vector<char>>& board) {
        for(int i = 0;i<9;i++){
            for(int j =0;j<9;j++){
                if(board[i][j]!='.'){
                    int num = board[i][j]-'0';
                    rowUsed[i][num]=true;
                    colUsed[j][num]=true;
                    kuaiUsed[i/3][j/3][num]=true;
                }
            }
        }
        dfs(0,0,board);
        board = this->res;
    }
};

不明白,因此请教大家。
已经解决,原因是最简单越界。。。
正确代码如下:

// 本题思路就是简单的回溯
// 注意限制:只有唯一解,限制了棋盘大小为9
class Solution {
public:
    bool rowUsed[9][10];//标记每一行哪些数字用过了
    bool colUsed[9][10];
    bool kuaiUsed[3][3][10];
    vector<vector<char>> res;
    vector<vector<char>> board;
    void getNext(int &row,int &col){
        col++;
        if(col==9){
            row++;
            col = 0;
        }
    }
    void dfs(int row,int col){
        cout<<"------"<<endl;
        if(row ==9){
            res = board;
            return ;
        }
        while(board[row][col]!='.'){
            getNext(row,col);
            if(row == 9){
                res = board;
                return ;
            }
        }
        int nextRow =row;
        int nextCol = col+1;
        if(nextCol == 9){
            nextCol =0;nextRow++;
        }
            //填充当前位置
        cout<<"row:"<<row<<" col:"<<col<<endl;
        for(int num =1; num<=9 ;num++){
            if(rowUsed[row][num]==false&&colUsed[col][num]==false&&kuaiUsed[row/3][col/3][num]==false){
                rowUsed[row][num]=true;
                colUsed[col][num]=true;
                kuaiUsed[row/3][col/3][num]=true;
                board[row][col]='0'+num;
                dfs(nextRow,nextCol);
                board[row][col]='.';
                rowUsed[row][num]=false;
                colUsed[col][num]=false;
                kuaiUsed[row/3][col/3][num]=false;
            }
        }
    }
    void solveSudoku(vector<vector<char>>& board) {
        this->board = board;
        cout<<this->board.size()<<endl;
        cout<<this->board[0].size()<<endl;
        for(int i = 0;i<9;i++){
            for(int j =0;j<9;j++){
                if(board[i][j]!='.'){
                    int num = board[i][j]-'0';
                    rowUsed[i][num]=true;
                    colUsed[j][num]=true;
                    kuaiUsed[i/3][j/3][num]=true;
                }
            }
        }
        dfs(0,0);
        board = this->res;
    }
};
posted @ 2023-01-11 12:20  思wu邪  阅读(256)  评论(1编辑  收藏  举报