LeetCode 332 重新安排行程
题目链接:https://leetcode.cn/problems/reconstruct-itinerary/
思路:
根本看不懂。
代码:
总结
LeetCode 51 N皇后
题目链接:https://leetcode.cn/problems/n-queens/
思路:
代码:
class Solution {
private:
vector<vector<string>>result;
void backtracking(vector<string>&chessboard,int row,int n)
{
// 终止条件
if(row == n)
{
result.push_back(chessboard);
return ;
}
for(int col = 0;col<n;col++)
{
if(isValid(chessboard,row,col,n))
{
chessboard[row][col] = 'Q';
row++;
backtracking(chessboard,row,n);
row--;
chessboard[row][col] = '.';
}
}
}
bool isValid(vector<string>&chessboard,int row,int col,int n)
{
// 同一列中是否有Queen
for(int i = 0;i<row;i++) // 保持列相同,然后在判断的这一行在前面几行的同一列中找Q
{
if(chessboard[i][col]=='Q')
return false;
}
// 检查45°角是否有Queen
for(int i = row-1,j = col-1;i>=0&&j>=0;i--,j--)
{
if(chessboard[i][j]=='Q')
return false;
}
// 检查135°角是否有Queen
for(int i = row-1,j = col+1;i>=0&&j<n;i--,j++)
{
if(chessboard[i][j]=='Q')
return false;
}
return true;
}
public:
vector<vector<string>> solveNQueens(int n) {
result.clear();
vector<string>chessboard(n,string(n,'.'));
backtracking(chessboard,0,n);
return result;
}
};
总结
重在理解,遇到就寄。
LeetCode 37 解数独
题目链接:https://leetcode.cn/problems/sudoku-solver/
思路:
二维递归,通过行和列确定位置然后再开始递归。
代码:
class Solution {
private:
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;
// 开始遍历1-9
for(char k = '1';k<='9';k++)
{
if(isValid(board,i,j,k))
{
board[i][j] = k;
bool result = backtracking(board);
if(result) return true;
// 回溯
board[i][j] = '.';
}
}
// 遍历完1-9都没有返回true代表该数独不可能解决
return false;
}
}
// 没有返回false说明找到合适的数独了
return true;
}
bool isValid(vector<vector<char>>&board,int row,int col,char val)
{
// 判断同一行中是否重复
for(int i = 0;i<9;i++)
{
if(board[row][i]==val)
return false;
}
// 判断同一列中是否重复
for(int i = 0;i<9;i++)
{
if(board[i][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;
}
public:
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
}
};
总结
重在理解,遇到就寄。
今日总结:
今天的都是困难题,重在理解和体验困难题的难度。遇到就寄。