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);
}