1、LeetCode332 重新安排行程
题目链接:332、重新安排行程
本题没太懂,容器也没看太懂,二刷再看看。代码随想录332重新安排行程
2、LeetCode51 N皇后
题目链接:51、N皇后
初始化棋盘:vector<string> chessboard(n, string(n, '.'));
终止条件:当递归到棋盘的最后一层时,收集结果并返回。
for (int col = 0; col < n; col++) 对列的遍历看作横向遍历,如果位置有效,‘.’改为‘Q’,递归backtracking(n, row + 1, chessboard); 回溯‘Q’改为'.'。
判断位置是否有效:检查列,检查左上角,检查右上角,不用检查行,因为每一层递归,只会选for循环(也就是同一行)里的一个元素。
class Solution {
public:
vector<vector<string>> result;
void backtracking(int n, int row, vector<string>& chessboard)
{
if (row == n)
{
result.push_back(chessboard);
return;
}
for (int col = 0; col < n; col++)
{
if (isValid(n, row, col, chessboard))
{
chessboard[row][col] = 'Q';
backtracking(n, row+1, chessboard);
chessboard[row][col] = '.';
}
}
}
bool isValid(int n, int row, int col, vector<string>& chessboard)
{
//查找列
for (int i = 0; i < row; i++)
{
if (chessboard[i][col] == 'Q') return false;
}
//查找45°,左上角
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--,j--)
{
if (chessboard[i][j] == 'Q') return false;
}
//查找135°,右上角
for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)
{
if (chessboard[i][j] == 'Q') return false;
}
return true;
}
vector<vector<string>> solveNQueens(int n) {
result.clear();
vector<string> chessboard(n, string(n, '.'));
backtracking(n, 0, chessboard);
return result;
}
};
3、LeetCode37解数独
题目链接:37、解数独
这道题也是半知半解,代码随想录37解数独
二维递归
本题递归不用终止条件,等数填满了棋盘自然就终止。
如果元素不为'.',continue。k从‘1’到‘9’遍历,判断要放入的元素是否合法,如果合法,放入k。
递归,回溯。
class Solution {
public:
bool backtracking(vector<vector<char>>& board)
{
for (int i = 0; i < board.size(); i++)
{
for (int j = 0; j < board.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;
}
}
return true;
}
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;
}
// 判断所在的3*3块是否重复
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);
}
};