332.重新安排行程
C++:
class Solution {
public:
// unordered_map<出发机场, map<到达机场, 航班次数>> targets
unordered_map<string,map<string,int>> targets;
vector<string>res;
bool backTracking(int ticketNum){
if(res.size()==ticketNum+1){
return true;
}
for(pair<const string,int>&target:targets[res[res.size()-1]]){
if(target.second>0){
res.push_back(target.first);
target.second--;
if(backTracking(ticketNum)) return true;
target.second++;
res.pop_back();
}
}
return false;
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
for(const vector<string>&vec:tickets){
targets[vec[0]][vec[1]]++;//记录映射关系
}
res.push_back("JFK"); // 起始机场
backTracking(tickets.size());
return res;
}
};
51. N皇后
C++:
class Solution {
public:
vector<vector<string>> res;
vector<vector<string>> solveNQueens(int n) {
vector<string> map(n,string(n,'.'));
backQueen(map,0,n);
return res;
}
void backQueen(vector<string>&map,int level,int n){//n*n
if(level==n){
res.push_back(map);
return;
}
for(int j=0;j<n;j++){
if(isValid(map,level,j,n)){
map[level][j]='Q';
backQueen(map,level+1,n);
map[level][j]='.';
}
}
}
bool isValid(vector<string>&map,int i,int j,int n){
for(int a=i;a>=0;a--){//"|"
if(map[a][j]=='Q') return false;
}
for(int a=i,b=j;a>=0&&b>=0;a--,b--){//"\"
if(map[a][b]=='Q') return false;
}
for(int a=i,b=j;a>=0&&b<n;a--,b++){//"/"
if(map[a][b]=='Q') return false;
}
return true;
}
};
37. 解数独
C++:
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
backTracking(board);
}
bool backTracking(vector<vector<char>>&board){
for(int i=0;i<board.size();i++){
for(int j=0;j<board.size();j++){//遍历行列
if(board[i][j]=='.'){
for(char k='1';k<='9';k++){// (i, j) 这个位置放k是否合适
if(isValid(i,j,k,board)){
board[i][j]=k;// 放置k
if(backTracking(board)) return true;//如果找到合适一组立刻返回
board[i][j]='.';//回溯,撤销k
}
}
return false; // 9个数都试完了,都不行,那么就返回false
}
}
}
return true; // 遍历完没有返回false,说明找到了合适棋盘位置了,此时在最后一个方块
}
bool isValid(int row, int col, char val, vector<vector<char>>& board) {
for(int i=0;i<9;i++){// 判断行里是否重复
if(board[row][i]==val) return false;
}
for(int j=0;j<9;j++){// 判断列里是否重复
if (board[j][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;
}
};