网站建设 今网科技,制作书签的方法和步骤,改了网站关键词,江西省赣州市定南县算法学习——LeetCode力扣回溯篇4 332. 重新安排行程
332. 重新安排行程 - 力扣#xff08;LeetCode#xff09;
描述
给你一份航线列表 tickets #xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票…算法学习——LeetCode力扣回溯篇4 332. 重新安排行程
332. 重新安排行程 - 力扣LeetCode
描述
给你一份航线列表 tickets 其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK肯尼迪国际机场出发的先生所以该行程必须从 JFK 开始。如果存在多种有效的行程请你按字典排序返回最小的行程组合。
例如行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小排序更靠前。 假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
示例
示例 1 输入tickets [[“MUC”,“LHR”],[“JFK”,“MUC”],[“SFO”,“SJC”],[“LHR”,“SFO”]] 输出[“JFK”,“MUC”,“LHR”,“SFO”,“SJC”]
示例 2
输入tickets [[“JFK”,“SFO”],[“JFK”,“ATL”],[“SFO”,“ATL”],[“ATL”,“JFK”],[“ATL”,“SFO”]] 输出[“JFK”,“ATL”,“JFK”,“SFO”,“ATL”,“SFO”] 解释另一种有效的行程是 [“JFK”,“SFO”,“ATL”,“JFK”,“ATL”,“SFO”] 但是它字典排序更大更靠后。
提示
1 tickets.length 300tickets[i].length 2fromi.length 3toi.length 3fromi 和 toi 由大写英文字母组成fromi ! toi
代码解析
回溯遍历超时
回溯遍历每一种可能 当出现第一种可能的路线之间加入。 当出现新的可能路线与老路线对比如果字典排序小于则替换老路线
class Solution {
public:vectorstring resul;vectorstring path;void backtraking(vectorvectorstring tickets , string Indnx , vectorbool used){//找到路线看是否替换老的路径//如果没有老路径直接加入如果相同就返回如果不同路径按照字典比较if(path.size()tickets.size()1){if(resul.empty()1) {resul path;return;}else if(resul path) return;else {for(int j0 ;jpath.size();j){for(int k0 ;k3;k){if(resul[j][k] path[j][k]) continue;else if(resul[j][k] path[j][k])return;else if(resul[j][k] path[j][k]) {resul.clear();resul path;return;}}}}// coutresu: ;// for(auto i:resul) couti ;// coutendl;return;}for(int i0 ; itickets.size();i){//如果当前机票使用过或者当前机票目的地不对跳过if(used[i]true || tickets[i][0] ! Indnx) continue;//如果当前机票可用则加入路径if(used[i] false tickets[i][0] Indnx){used[i] true;path.push_back(tickets[i][1]);//递归确定递归找的新机票。下一站机票的开始机场就是当前机票的目的地机场backtraking(tickets,tickets[i][1],used);used[i] false;path.pop_back();}}return;}vectorstring findItinerary(vectorvectorstring tickets) {vectorbool used(tickets.size(),false);path.push_back(JFK);backtraking(tickets,JFK,used);return resul;}
};
排序再回溯
先对输入票排序其中排序按照票的目的地的字典减少排序因为出发点是确定的目的地多种找最优解 之后回溯遍历找路线发现的第一个路线即为最优路线
class Solution {
public://按飞机票目的地字符串vector第二个参数字典减小排序class compare{public:bool operator()( const vectorstring tickets1 ,const vectorstring tickets2 ){if((tickets1[1])[0] (tickets2[1])[0]) return 1;else if((tickets1[1])[0] (tickets2[1])[0]){if((tickets1[1])[1] (tickets2[1])[1]) return 1;else if((tickets1[1])[1] (tickets2[1])[1]){if((tickets1[1])[2] (tickets2[1])[2]) return 1;else return 0;}return 0;}return 0;}};vectorstring resul;vectorstring path;bool find false;void backtraking(vectorvectorstring tickets , string Indnx , vectorbool used){//找到一个路径就不找了直接是最优路径if(find true ) return;if(path.size()tickets.size()1){resul path;find true;return;}for(int i0 ; itickets.size();i){if(used[i]true || tickets[i][0] ! Indnx) continue;if(used[i] false tickets[i][0] Indnx){used[i] true;path.push_back(tickets[i][1]);backtraking(tickets,tickets[i][1],used);used[i] false;path.pop_back();}}return;}vectorstring findItinerary(vectorvectorstring tickets) {vectorbool used(tickets.size(),false);sort(tickets.begin(),tickets.end(),compare());// for(auto i:tickets) // {// cout[;// for(auto j:i)// {// coutj ;// }// cout];// }path.push_back(JFK);backtraking(tickets,JFK,used);return resul;}
};
51. N 皇后
51. N 皇后 - 力扣LeetCode
描述
按照国际象棋的规则皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上并且使皇后彼此之间不能相互攻击。
给你一个整数 n 返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例
示例 1
输入n 4 输出[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]] 解释如上图所示4 皇后问题存在两个不同的解法。
示例 2
输入n 1 输出[[“Q”]]
提示
1 n 9
代码解析
递归遍历
主要是去除同行和同列
class Solution {
public:vectorvectorstring result;vectorintpath;//求绝对值int abs(int a){if (a 0) return -a;else return a;}void backtraking(int n ,vectorbool used ,int deep){ //当深度大于n时返回if(deep n) return;//当路径为最大深度找到路径存入if(path.size() n){//将数字路径转换成字符串路径vectorstring path_s;for(int i0;in;i){string tmp ;for(int k0;kn;k) tmp .;//建立n个.for(int j0;jn;j) if(jpath[i]) tmp[j] Q;//在应该放Q的位置放Qpath_s.push_back(tmp);//转换好的字符串存入路径}//存入结果result.push_back(path_s);return;}//层次循环找到每一行的点。for(int i0 ; in; i){if(used[i] true) continue; //该点用过了跳过。一个树枝的点只能用一次pairint,int x(deep,i);//当前可能有效点bool flag true;//当前点和path路径里面所有点依次对比for(int j 0 ; j path.size() ;j){pairint,int y(j,path[j]);//path之前加入的点//检测当前点与之前路径点是否在一列一行和对角线if( abs(x.first - y.first)0 || abs(x.second - y.second)0 || abs(x.first - y.first) abs(x.second - y.second) ) flag false;}//检测是合格点加入pathif(flag true){//记录该点使用used[i] true;path.push_back(i);//递归深度1找下一行backtraking(n,used,deep1);path.pop_back();used[i] false;}}return;}vectorvectorstring solveNQueens(int n) { vectorbool used(n,false);backtraking(n ,used,0);return result;}
};
37. 解数独
37. 解数独 - 力扣LeetCode
描述
编写一个程序通过填充空格来解决数独问题。
数独的解法需 遵循如下规则
数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。请参考示例图 数独部分空格内已填入了数字空白格用 ‘.’ 表示。
示例
示例 1
输入board [[“5”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”],[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”],[“.”,“9”,“8”,“.”,“.”,“.”,“.”,“6”,“.”],[“8”,“.”,“.”,“.”,“6”,“.”,“.”,“.”,“3”],[“4”,“.”,“.”,“8”,“.”,“3”,“.”,“.”,“1”],[“7”,“.”,“.”,“.”,“2”,“.”,“.”,“.”,“6”],[“.”,“6”,“.”,“.”,“.”,“.”,“2”,“8”,“.”],[“.”,“.”,“.”,“4”,“1”,“9”,“.”,“.”,“5”],[“.”,“.”,“.”,“.”,“8”,“.”,“.”,“7”,“9”]] 输出[[“5”,“3”,“4”,“6”,“7”,“8”,“9”,“1”,“2”],[“6”,“7”,“2”,“1”,“9”,“5”,“3”,“4”,“8”],[“1”,“9”,“8”,“3”,“4”,“2”,“5”,“6”,“7”],[“8”,“5”,“9”,“7”,“6”,“1”,“4”,“2”,“3”],[“4”,“2”,“6”,“8”,“5”,“3”,“7”,“9”,“1”],[“7”,“1”,“3”,“9”,“2”,“4”,“8”,“5”,“6”],[“9”,“6”,“1”,“5”,“3”,“7”,“2”,“8”,“4”],[“2”,“8”,“7”,“4”,“1”,“9”,“6”,“3”,“5”],[“3”,“4”,“5”,“2”,“8”,“6”,“1”,“7”,“9”]] 解释输入的数独如上图所示唯一有效的解决方案如下所示 提示
board.length 9board[i].length 9board[i][j] 是一位数字或者 ‘.’题目数据 保证 输入数独仅有一个解
代码解析
class Solution {
public:bool cheack( vectorvectorchar board , int row ,int col ,int val){for(int i0 ; i board[0].size() ;i) //检查行{if(board[row][i] val ){return false;}}for(int i0 ; i board.size() ;i) //检查列{if(board[i][col] val){return false;}}int startRow (row / 3)*3;int startCol (col / 3)*3;for(int istartRow ; i startRow 3 ;i) //检查小方块{for(int jstartCol ; j startCol 3 ;j){if(board[i][j] val){return false;}}}return true;}bool backtarking(vectorvectorchar board){for(int i0 ; i board.size() ; i) //递归行{for(int j0 ; jboard[0].size() ;j)//递归列{if(board[i][j] ! .) continue;//已有的跳过for( char k 1 ; k9;k){if(cheack(board,i,j,k)) //检查当前k是否符合{board[i][j] k;if(backtarking(board)) return true; //当找到一组成功的就不接着找了直接返回trueboard[i][j] .;}}return false ;}}return true;//行和列都满足了返回找到}void solveSudoku(vectorvectorchar board) {bool tmp backtarking(board);}
}; 文章转载自: http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn http://www.morning.flncd.cn.gov.cn.flncd.cn http://www.morning.trqsm.cn.gov.cn.trqsm.cn http://www.morning.kxbry.cn.gov.cn.kxbry.cn http://www.morning.xbmwh.cn.gov.cn.xbmwh.cn http://www.morning.rbkdg.cn.gov.cn.rbkdg.cn http://www.morning.srsln.cn.gov.cn.srsln.cn http://www.morning.ylpl.cn.gov.cn.ylpl.cn http://www.morning.jkzq.cn.gov.cn.jkzq.cn http://www.morning.pbygt.cn.gov.cn.pbygt.cn http://www.morning.lsbjj.cn.gov.cn.lsbjj.cn http://www.morning.qrpx.cn.gov.cn.qrpx.cn http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn http://www.morning.lfxcj.cn.gov.cn.lfxcj.cn http://www.morning.rtkgc.cn.gov.cn.rtkgc.cn http://www.morning.jwgmx.cn.gov.cn.jwgmx.cn http://www.morning.xbzfz.cn.gov.cn.xbzfz.cn http://www.morning.jcwrb.cn.gov.cn.jcwrb.cn http://www.morning.dnwlb.cn.gov.cn.dnwlb.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.mm27.cn.gov.cn.mm27.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.wnbqy.cn.gov.cn.wnbqy.cn http://www.morning.sbkb.cn.gov.cn.sbkb.cn http://www.morning.ksqyj.cn.gov.cn.ksqyj.cn http://www.morning.zwgbz.cn.gov.cn.zwgbz.cn http://www.morning.kjfqf.cn.gov.cn.kjfqf.cn http://www.morning.dydqh.cn.gov.cn.dydqh.cn http://www.morning.lwgsk.cn.gov.cn.lwgsk.cn http://www.morning.crsqs.cn.gov.cn.crsqs.cn http://www.morning.drmbh.cn.gov.cn.drmbh.cn http://www.morning.gtkyr.cn.gov.cn.gtkyr.cn http://www.morning.lftpl.cn.gov.cn.lftpl.cn http://www.morning.lhwlp.cn.gov.cn.lhwlp.cn http://www.morning.bdwqy.cn.gov.cn.bdwqy.cn http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn http://www.morning.wnnts.cn.gov.cn.wnnts.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.kksjr.cn.gov.cn.kksjr.cn http://www.morning.bpmnc.cn.gov.cn.bpmnc.cn http://www.morning.nbpqx.cn.gov.cn.nbpqx.cn http://www.morning.bhwz.cn.gov.cn.bhwz.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.xgmf.cn.gov.cn.xgmf.cn http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn http://www.morning.ndmh.cn.gov.cn.ndmh.cn http://www.morning.qzqjz.cn.gov.cn.qzqjz.cn http://www.morning.kgqww.cn.gov.cn.kgqww.cn http://www.morning.qxmys.cn.gov.cn.qxmys.cn http://www.morning.pqnpd.cn.gov.cn.pqnpd.cn http://www.morning.zxrtt.cn.gov.cn.zxrtt.cn http://www.morning.jntcr.cn.gov.cn.jntcr.cn http://www.morning.dwrbn.cn.gov.cn.dwrbn.cn http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn http://www.morning.wtcbl.cn.gov.cn.wtcbl.cn http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.zybdj.cn.gov.cn.zybdj.cn http://www.morning.zcmpk.cn.gov.cn.zcmpk.cn http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn http://www.morning.bnmfq.cn.gov.cn.bnmfq.cn http://www.morning.bby45.cn.gov.cn.bby45.cn http://www.morning.ggfdq.cn.gov.cn.ggfdq.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.qncqd.cn.gov.cn.qncqd.cn http://www.morning.rjmg.cn.gov.cn.rjmg.cn http://www.morning.lxbml.cn.gov.cn.lxbml.cn http://www.morning.jpjxb.cn.gov.cn.jpjxb.cn http://www.morning.mgzjz.cn.gov.cn.mgzjz.cn http://www.morning.qhrdx.cn.gov.cn.qhrdx.cn http://www.morning.wknj.cn.gov.cn.wknj.cn http://www.morning.gkmwk.cn.gov.cn.gkmwk.cn http://www.morning.ymtbr.cn.gov.cn.ymtbr.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.tpdg.cn.gov.cn.tpdg.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.lwzpp.cn.gov.cn.lwzpp.cn http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn http://www.morning.rqgq.cn.gov.cn.rqgq.cn http://www.morning.cldgh.cn.gov.cn.cldgh.cn