重新安排行程
题目解答
class Solution {
public:
unordered_map<string, map<string,int>> targets;
// 出发点 对应的终止点 对应的个数
bool backtraking(int ticketNum, vector<string>& result){
if(result.size()==ticketNum+1){
return true;
}
for(pair<const string, int>& target:targets[result[result.size()-1]]){//代码中一定要交&(引用)的操作,要好不然对于
// 后面的++和--操作是无效的
//for循环对应的是:取出result最后一个元素(也就是以他为出发点)对应的键值对
if(target.second > 0){//记录到达机场是否飞过了
result.push_back(target.first);
target.second--;
if(backtraking(ticketNum,result)) return true;
result.pop_back();
target.second++;
}
}
return false;
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
targets.clear();
vector<string> result;
for(const vector<string>&vec: tickets){
targets[vec[0]][vec[1]]++;
}
result.push_back("JFK");
backtraking(tickets.size(), result);
return result;
}
};
解题说明
自己是尝试做了做,但是代码写得又臭又烂,而且还过不了,所以,就直接看卡哥的题解了。
解答该题目需要注意:
- 使用map,就要熟悉它,要不然还真不好弄。
- 该回溯函数具有返回值,那么就要注意如何使用有返回值的回溯了。
- 还有就是对代码中ticketNum的使用和理解了。
- 实在是弄不懂的话可以自己照着代码画画树状图,这样容易理解。
N皇后
题目解答
class Solution {
public:
vector<vector<string>> result;
bool isValid(int row, int col, vector<string>& chessBorad, int n){
for(int i=0; i<row; i++){//检查列
if(chessBorad[i][col]=='Q') return false;
}
for(int i=row-1,j=col-1; i>=0 && j>=0; i--,j--){//45°
if(chessBorad[i][j]=='Q') return false;
}
for(int i=row-1,j=col+1; i>=0 && j<n; i--, j++){
if(chessBorad[i][j]=='Q') return false;
}
return true;
}
void backtraking(vector<string>& chessBorad, int row, int n){
if(row==n){
result.push_back(chessBorad);
return;
}
for(int col=0; col<n; col++){
if(isValid(row,col,chessBorad,n)){
chessBorad[row][col]='Q';
backtraking(chessBorad,row+1,n);
chessBorad[row][col]='.';
}
}
return;
}
vector<vector<string>> solveNQueens(int n) {
vector<string> chessBorad(n,string(n,'.'));
backtraking(chessBorad,0,n);
return result;
}
};
解题注意事项
对于isValid函数,没有对行的处理,因为在单层搜索的过程中,每一层递归,只会选for循环(也就是同一行)里的一个元素,所以不用去重了。
对于某些回溯题目中对应的添加元素有作要求时,可以在for循环中添加if语句
for( ){
if( 题目做要求的条件 ){
}
}
这样写代码能达到期望的要求。