LeetCode 51.N皇后
题目链接:51.N皇后
踩坑:先看了视频,没踩什么坑
思路:类似于一种排列问题,只不过每个位置之间需要满足一些条件。用回溯法可以穷举所有的情况。
代码:
class Solution {
public:
void backtracking(int n, int row, vector<string>& path, vector<vector<string>>& result)
{
if(n == row){
result.push_back(path);
return;
}
for(int i = 0; i < n; i++)
{
if(isVaul(n, path, row, i))
{
path[row][i] = 'Q';
backtracking(n, row+1, path, result);
path[row][i] = '.';
}
}
}
bool isVaul(int n, vector<string>& path, int r, int l)
{
for(int i = 0; i < n ;i++)
{
if(path[r][i] == 'Q') return false;
if(path[i][l] == 'Q') return false;
}
for(int i = r, j = l; i >=0 && j >=0; i--, j--)
{
if(path[i][j] == 'Q') return false;
}
for(int i = r, j = l; i < n && j < n; i++, j++)
{
if(path[i][j] == 'Q') return false;
}
for(int i = r, j = l; i >= 0 && j < n; i--, j++)
{
if(path[i][j] == 'Q') return false;
}
for(int i = r, j = l; i < n && j >= n; i++, j--)
{
if(path[i][j] == 'Q') return false;
}
return true;
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> result;
vector<string> path(n, string(n, '.'));
backtracking(n, 0, path, result);
return result;
}
};
LeetCode 37.解数独
题目链接:37.解数独
踩坑:还是对这种只要有一个节点满足条件就返回的模式不熟悉。
思路:这是一道非常值得思考的题,包含了很多细节,比如何时返回true,表示什么含义,何时返回false,表示什么含义。整体框架为,遍历整个棋盘,找到为’.‘的位置开始递归。需要注意的是,当整个棋盘都找不到’.'时说明一个解已经诞生,此时可以返回true。而当某一个位置1-9都无法使用时,一定是上层需要调整,返回false。
代码:
class Solution {
public:
bool backtracking(vector<vector<char>>& board)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(board[i][j] == '.')
{
for(int k = 1; k < 10; k++)
{
if(isVaul(board, i, j, k))
{
board[i][j] = k + '0';
bool result = backtracking(board);
if(result) return true;
board[i][j] = '.';
}
}
return false;
}
}
}
return true;
}
bool isVaul(vector<vector<char>>& board, int row, int col, int x)
{
for(int i = 0; i < 9; i++)
{
if(board[row][i] == x+'0') return false;
if(board[i][col] == x+'0') return false;
}
int rr = row - (row % 3);
int cc = col - (col % 3);
for(int i = rr; i < rr+3; i++)
{
for(int j = cc; j < cc+3 ; j++)
{
if(board[i][j] == x+'0') return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
};
LeetCode 332.重新安排行程
好难。。。。二刷再看