代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后、37. 解数独

题目:332.重新安排行程

文章链接:代码随想录

题目链接:力扣题目链接

图释:

代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后、37. 解数独_第1张图片

class Solution {
public:
    // unordered_map<出发机场, map<抵达机场, 航班次数>> targrts;
    unordered_map> targrts;
 
    bool backtracking(int ticketNum, vector& result){
        // 所有机票都要用一次 
        if(result.size() == ticketNum+1){ //航线次数+1
            return true;
        }
        // targrts[result[result.size()-1]] 从结果集里的最后一个目的地,作为出发地,找到以航班中的航线
        for(pair& targrt: targrts[result[result.size()-1]]){
            if(targrt.second > 0){ // 检测本航线是否飞过
               result.push_back(targrt.first);
               targrt.second--;
               if(backtracking(ticketNum, result)) return true; // 如果下层递归有返true则继续向上返回true
               // 没有返回找到航班则回溯
               result.pop_back();
               targrt.second++;
            }
        }
        // 遍历完,以该地点作为出发地的航线都不行,则返回
        return false; 
    }

    vector findItinerary(vector>& tickets) {
        targrts.clear();
        vector result;
        // vec = ["MUC","LHR"] 遍历赋值给vec
        for(const vector vec : tickets){
            // >
            targrts[vec[0]][vec[1]]++;
        }
        result.push_back("JFK"); // 放入首发机场
        backtracking(tickets.size(), result); // 航线次数
        return result;
    }
};

题目:51. N皇后

文章链接:代码随想录

视频链接:LeetCode:51.N皇后

题目链接:力扣题目链接

图释:

代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后、37. 解数独_第2张图片

class Solution {
public:
    vector> result;
    bool isValid(int row, int col, vector chessboard, int n){
       // 检测列
       for(int i=0; i=0 && j>=0; i--,j--){
           // 当row==clo==0时,不会进入
           if(chessboard[i][j] == 'Q') return false; // 一直循环向↖找
       }
        for(int i=row-1, j=col+1; i>=0 && j<=n; i--,j++){
           if(chessboard[i][j] == 'Q') return false; // 一直循环向↗找
       }
       return true;
    }    
    // 传入棋盘
    void backtracking(vector chessboard, int n, int row){
        if(row == n){
            // 在进入递归之前就判断该位置能否放入皇后了,所以当递归到最后一行,说明是合法的
            result.push_back(chessboard);
            return;
        }
        // 树层逻辑  遍历某行的每一列
        for(int col=0; col> solveNQueens(int n) {
        result.clear();
        // 根据传入的n构建棋盘格
        std::vector chessboard(n, std::string(n, '.'));
        backtracking(chessboard, n, 0);
        return result;
    }
};

题目:37. 解数独

文章链接:代码随想录

视频链接:LeetCode:

题目链接:力扣题目链接

图释:

代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后、37. 解数独_第3张图片

class Solution {
public:
    bool isValid(int row, int col, char k, vector>& board){
        for(int i=0; i<9; i++){// 判断行有无重复
           if(board[row][i]==k)return false;
        }
        for(int j=0; j<9; j++){// 判断列有无重复
           if(board[j][col]==k)return false;
        }
        // 判断格子中有无重复
        int startRow = (row/3)*3; 
        int startCol = (col/3)*3;
        for(int i=startRow; i>& board){
        // 二维递归
        for(int i=0; i>& board) {
        backtracking(board);
    }
};

你可能感兴趣的:(算法,c++,leetcode)