解数独问题

这篇博客探讨了如何运用回溯法来解决经典的N皇后问题和数独难题。通过递归遍历棋盘的行和列,确定皇后的位置并检查合法性。在数独解题过程中,介绍了如何判断当前位置填入的数字是否符合行、列和宫的约束。当所有位置都尝试过但无法找到解决方案时,采用回溯策略撤销前一步操作,继续寻找其他可能。文章还提供了关键的isValid函数,用于验证当前位置的数字是否合法。
摘要由CSDN通过智能技术生成

N皇后问题每行每列只放一个皇后,所以只需要for循环遍历一行,递归来遍历列,确定皇后位置,而棋盘的每个位置都要放一个数字并检查是否合法。

回溯三部曲:

(1)函数参数及返回值:返回值为bool型,因为每找到一个符合的条件就立刻返回。

(2)终止条件:等数填满自然就终止。

(3)单层搜索逻辑:需要一个二维递归,一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,递归遍历数字的可能性。

//解数独
bool backtracking(vector<vector<char>>& board) {
    for(int i = 0; i<board.size(); i++) {
        for(int j = 0; j<board[0].size(); j++) {
            if(board[i][j] != '.') continue;
            for(char k = '1' ; k<= '9'; k++) {
                if(isValid(i,j,k,board)) {
                    board[i][j] = k;
                    if(backtracking(board)) return true; //递归
                    board[i][j] = '.'; //回溯 
                }
            }
            return false; //9个数字都不行就return false; 
        }
    }
    return true; //遍历完没有返回false,说明找到了合适棋盘位置了
}

bool isValid(int row, int col, char val, vector<vector<char>> board) {
    //判断行是否重复
    for(int i = 0; i<9; i++) {
        if(board[row][i] == val) {
            return false;
        }
    }
    //判断列是否重复
    for(int j = 0; j<9; j++) {
        if(board[j][col] == val) {
            return false;
        }
    }
    int startRow = (row/3)*3;
    int startCol = (col/3)*3;
    for(int i = startRow; i<startRow+3; i++) {
        for(int j = startCol; j<startCol+3; j++) {
            if(board[i][j] == val) {
                return false;
            }
        }
    }
    return true;
}

void solveSudoku(vector<vector<char>>& board) {
    backtracking(board);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值