N皇后和数独问题&lambda表达式
·
class Solution {
public:
vector<vector<string>>result;
int row = 0;
void backtracking(vector<string> &chessboard,int n,int row) {
if(n == row) {
result.push_back(chessboard);
return ;
}
for(int col = 0; col < n; col ++ ) {
if(isVaild(row,col,n,chessboard)) {
chessboard[row][col] = 'Q';
backtracking(chessboard,n,row + 1);
chessboard[row][col] = '.';
}
}
}
bool isVaild(int row, int col, int n, vector<string>& chessboard) {
for(int i = 0 ; i < row; i ++) {
if(chessboard[i][col] == 'Q') {
return false;
}
}
for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i --, j --) {
if(chessboard[i][j] == 'Q') {
return false;
}
}
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) {
vector<string> chessboard(n, string(n, '.'));
backtracking(chessboard,n,row);
return result;
}
};
数独:
class Solution {
public:
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] == '.') {
for(char k = '1'; k <= '9'; k ++ ) {
if(isVaild(board,i,j,k)) {
board[i][j] = k;
if(backtracking(board)) return true;
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
bool isVaild(vector<vector<char>>& board,int row,int col,char k) {
for(int i = 0; i < 9; i ++ ) {
if(board[i][col] == k) {
return false;
}
}
for(int j = 0; j < 9; j ++ ) {
if(board[row][j] == k) {
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] == k) {
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
};
利用树的递归遍历思想。
lambda:
值捕获
- C++11~17:[=] 骗了你,它捕获的是 this 指针,不是对象 → detach 后必炸。
- C++17:用 [*this] 手动拷贝对象 → 安全。
- C++20+:[=] 自动变成 [*this] → 终于默认安全了。
- 引用捕获:
- 引用捕获的体积永远是 8 字节(64位机器),不管你捕获的是 int 还是一个 10MB 的大对象。
- 一旦被捕获的变量生命周期结束,lambda 里保存的地址就变成悬垂引用(dangling reference)。
- C++ 标准明确说:使用悬垂引用是未定义行为(Undefined Behavior),可能崩溃、可能打印旧值、可能被别的对象覆盖。
更多推荐

所有评论(0)