332.重新安排行程
题目:力扣
class Solution {
public:
unordered_map<string,map<string,int> > targets;
bool backtracking(vector<string>& ans,int size){
if(ans.size() == size + 1){
return true;
}
for(pair<const string, int>& a : targets[ans[ans.size() - 1]]){
if(a.second > 0){
a.second--;
ans.push_back(a.first);
if(backtracking(ans,size)) return true;
ans.pop_back();
a.second++;
}
}
return false;
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
vector<string> ans;
for(int i = 0; i < tickets.size(); ++i){
targets[tickets[i][0]][tickets[i][1]]++;
}
ans.push_back("JFK");
backtracking(ans,tickets.size());
return ans;
}
};
51. N皇后
题目:力扣
class Solution {
public:
vector<vector<string>> result;
bool is_value(int row,int col, vector<string>& ans, int n){
for(int i = 0; i < n; ++i){
if(ans[i][col] == 'Q'){
return false;
}
}
for(int i = row - 1,j = col - 1; i >= 0 && j >= 0; --i,--j){
if(ans[i][j] == 'Q'){
return false;
}
}
for(int i = row - 1,j = col + 1; i >= 0 && j < n; --i,++j){
if(ans[i][j] == 'Q'){
return false;
}
}
return true;
}
void backtracking(int row,int n, vector<string>& ans){
if(row == n){
result.push_back(ans);
}
for(int col = 0; col < n; ++col){
if(is_value(row,col,ans,n)){
ans[row][col] = 'Q';
backtracking(row+1, n, ans);
ans[row][col] = '.';
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<string> ans(n,string(n,'.'));
backtracking(0,n,ans);
return result;
}
};
37. 解数独
题目:力扣
class Solution {
public:
bool is_value(int row,int col,vector<vector<char>>& board, char n){
for(int i = 0; i< 9; i++){
if(board[i][col] == n) return false;
}
for(int i = 0; i < 9; i++){
if(board[row][i] == n) return false;
}
int start_i = 3 * (row / 3);
int start_j = 3 * (col / 3);
for(int i = start_i; i < start_i + 3 ; ++i){
for(int j = start_j; j < start_j + 3; ++j){
if(board[i][j] == n) return false;
}
}
return true;
}
bool backtracking(vector<vector<char>>& board){
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 9; ++j){
if(board[i][j] != '.') continue;
for(char k = '1'; k <= '9'; ++k){
if(is_value(i,j,board,k)){
board[i][j] = k;
if (backtracking(board)) return true;
board[i][j] = '.';
}
}
return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backtracking(board);
return ;
}
};
总结
题型:重新安排路径,n皇后,数独
技巧:
有唯一解找到后就可以层层返回。
//存取路径,且按照字母序排序的数据结构
unordered_map<string,map<string,int> > targets;
回溯法
(1)找好回溯树的层宽(for循环)和深度(下一次迭代)都代表什么
(2)写好每一层的去重判断条件去处理特殊情况,如n皇后和数独
(3)找到回溯的终止条件