day 30 第七章 回溯算法part06

● 332.重新安排行程
关键是怎么实现起始机场与到达机场的映射,并且具有字典序
● 51. N皇后 棋盘行就是深度,棋盘列就是广度
终止条件就是遍历到最后一行
需要判断棋格放皇后是否有效
判断列,45度角,135度角是否存在皇后

● 37. 解数独
未完成
● 总结

● 332.重新安排行程

/*
 * 332. 重新安排行程
困难
给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。
例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。

 */
#include <unordered_map>
#include <map>
class Solution_332 {
 public:
  unordered_map<string, map<string, int>> res;
  bool back(int tickt_num, vector<string>& path){
      if(tickt_num + 1 == path.size()){
          return true;
      }

      for(auto &arrive : res[path[path.size() - 1]]){
          if(arrive.second > 0){
              path.push_back(arrive.first);
              arrive.second -= 1;
              if(back(tickt_num, path))
                  return true;
              path.pop_back();
              arrive.second += 1;
          }
      }
      return false;
  }
  vector<string> findItinerary(vector<vector<string>>& tickets) {

      for(vector<string> start : tickets){
          res[start[0]][start[1]]++;
      }
      vector<string> path;
      path.push_back("JFK");
      back(tickets.size(), path);
      return path;
  }
};

● 51. N皇后

/*
 * 51. N 皇后
困难

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
 */

class Solution_51 {
 public:
  bool is_valid(int row, int col, vector<string> &chessboard, int n){
      //判断列
      for(int i = 0; i < row; i++){
          if(chessboard[i][col] == 'Q')
              return false;
      }

      //45度角
      for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){
          if(chessboard[i][j] == 'Q')
              return false;
      }

      //135度角
      for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++){
          if(chessboard[i][j] == 'Q')
              return false;
      }

      return true;
  }
  vector<vector<string>> res;
  vector<string> path;
  void back(int n, int row){
      if(row == n) {
          res.push_back(path);
          return;
      }
      for(int i = 0; i < n; i++){
          if(is_valid(row, i, path, n)){
              path[row][i] = 'Q';
              back(n, row + 1);
              path[row][i] = '.';
          }
      }
  }
  vector<vector<string>> solveNQueens(int n) {

      path = vector<string>(n, string(n, '.'));
      back(n, 0);
      return res;
  }
};

● 37. 解数独
● 总结

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值