回溯

目前是一名大四的求职学生,因为找到工作了,也没怎么去做题,没想到一遇到题居然一点不记得怎么去做,因为没学过算法,半年前就在力扣刷了两个月的题,今天同学遇到题问我,居然一瞬间忘记了怎么处理,所以做题还是要坚持啊。

 

题目的大概意思是,有54张牌,每次能选1-3张,拿到最后一张牌的就算胜利,你首先拿一张,我的想法直接换成了奥数思维,思考怎么去赢,这很简单,但是要打印出所有可能赢的序列,在不知道策略的情况下,因为stl最近也没怎么看,一下子就忘记了。

那么分析一下,很明显需要全排列,那么就可以用回溯来做,那么一想简单,就是dsp+回溯,54张牌作为递归的条件。

伪代码:

void dfsint x; int n; vector<int> path{

  If(n<0)

    return;

  else if(n==0){

    If(x%2){

      res.push_back(path)

    }

  }

  for(int i=0; i<3; i++) {

    path.push_back(i);

    dfs(x+1, n-1, path);

    path.pop_back();

  }

}

 

x记录递归次数,奇数为胜利,将数列记录。

 

回溯的题做过也不少,基本就是带入回溯的模板,具体的条件在处理

void dfsint start, vector<int> &num, vector<int> &track{

  //到达临界条件

  If(num.size() == track.size()) {

    res.push_back(track);

      return;

  }

 

  for(int i=start; i<n; i++) {

    track.push_back(i);

    dfs(i, nums, track);

    track.pop_back();

  }

}

 

力扣经典题,电话号码的组合,全排列,N皇后(有点烦)。

posted on 2022-04-03 15:02  程序员路飞  阅读(138)  评论(0)    收藏  举报