当前位置:   article > 正文

递归专题训练详解(回溯,剪枝,深度优先)_如何训练递归

如何训练递归

1.汉诺塔问题

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

  1. //确定子问题处理方式是相同的
  2. //确定递归函数的函数头传参
  3. //确定函数体也就子问题的处理方式
  4. //判断函数出口
  5. class Solution {
  6. public:
  7. void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
  8. int n=A.size();
  9. dfs(A,B,C,n);
  10. }
  11. void dfs(vector<int>& A,vector<int>&B ,vector<int>& C,int n){
  12. if(n==1){
  13. C.push_back(A.back());//这里一定是要A.back(),可以画一下递归展开图
  14. A.pop_back();
  15. return;
  16. }//函数出口
  17. dfs(A,C,B,n-1);//不关心如何递归下去的,认为该函数一定能够帮我做到把a上的n-1数据借助c挪动b上
  18. C.push_back(A.back());//这里一定是要A.back(),可以画一下递归展开图
  19. A.pop_back();
  20. dfs(B,A,C,n-1);//同样认为该函数一定能把b上残留的n-1个数据借助a放到c上面
  21. }
  22. };

2.合并升序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
  14. ListNode* newHead=merge(list1,list2);
  15. return newHead;
  16. }
  17. ListNode* merge(ListNode* l1,ListNode* l2){
  18. if(l1==nullptr) return l2;
  19. if(l2==nullptr) return l1;
  20. if(l1->val<l2->val){
  21. l1->next=merge(l1->next,l2);
  22. return l1;//返回拼好的头节点
  23. }
  24. else{
  25. l2->next=merge(l2->next,l1);
  26. return l2;
  27. }
  28. }
  29. };

3. 反转链表

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* reverseList(ListNode* head) {
  14. if(head==nullptr||head->next==nullptr)return head;
  15. ListNode* newhead=reverseList(head->next);//认为一定可以返回一个已经逆序的子链表
  16. head->next->next=head;//让已经逆序的子序列的头节点指向子序列的上一个头节点
  17. head->next=nullptr;
  18. return newhead;//这里newhead一直是没有移动过的,一直都是新的链表的头结点。
  19. }
  20. };

4. 两两交换链表中的节点

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* swapPairs(ListNode* head) {
  14. if(head==nullptr||head->next==nullptr)
  15. {
  16. return head;
  17. }
  18. ListNode* new_head=head->next;
  19. ListNode* tmp=head->next->next;//小心中途修改的问题
  20. head->next->next=head;
  21. head->next=swapPairs(tmp);
  22. return new_head;
  23. }
  24. };

5. Pow(x,n)

  • -100.0 < x < 100.0
  • -2^31 <= n <= 2^31-1
  • -10^4 <= x^n <= 10^4

本题需要注意负数的情况和超int取值范围的情况

这样会语法报错。。。

  1. class Solution {
  2. public:
  3. double myPow(double x, int n)
  4. {
  5. return n > 0 ?pow(x,n) : 1.0/pow(x,-(long long)n );
  6. }
  7. double pow(double x,long long n)
  8. {
  9. if(n==0) return 1.0;
  10. double ret=pow(x,n/2);
  11. if(n%2==0){return ret*ret;}
  12. else{return ret*ret*x;}
  13. }
  14. };

6. 布尔逻辑二叉树

  1. class Solution {
  2. public:
  3. bool evaluateTree(TreeNode* root) {
  4. if(root->left==nullptr)
  5. {
  6. if(root->val==1)return true;
  7. else return false;
  8. }
  9. bool left=evaluateTree(root->left);
  10. bool right=evaluateTree(root->right);
  11. if(root->val==2)
  12. {
  13. return left || right;
  14. }
  15. else
  16. {
  17. return left && right;
  18. }
  19. }
  20. };

7.根到叶子之和 

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。

计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. //函数头设计,我们认为传入一个节点,那么就会算出此节点到所有节点的数字之和
  13. //函数体:从上一层获得此前的所有数字组合再拼上此层,所以需要多设计一个参数来记录
  14. //函数出口:当没有孩子的时候
  15. class Solution {
  16. public:
  17. int sumNumbers(TreeNode* root) {
  18. return dfs(root,0);
  19. }
  20. int dfs(TreeNode* root,int presum)
  21. {
  22. // if(root==nullptr)
  23. // {
  24. // return presum;题目给的一定是有一个节点
  25. // }
  26. presum=presum*10+root->val;
  27. std::cout<<presum<<std::endl;
  28. int ret=0;//因为函数的功能是用来计算之和并返回,所以不能直接presum传入,此处presum只是用于记录已经遍历了的数字。
  29. if(root->left==nullptr&&root->right==nullptr){
  30. return presum;
  31. }
  32. if(root->left) ret+=dfs(root->left,presum);
  33. if(root->right) ret+= dfs(root->right,presum);
  34. return ret;
  35. }
  36. };

8.二叉树剪枝

给定一个二叉树 根节点 root ,树的每个节点的值要么是 0,要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。

节点 node 的子树为 node 本身,以及所有 node 的后代。

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. //函数体设计
  13. //返回一个已经剪枝的根节点
  14. //函数出口:当自己是空的时候返回空,处理动作一致
  15. class Solution {
  16. public:
  17. TreeNode* pruneTree(TreeNode* root) {
  18. // if(root==nullptr)
  19. // {
  20. // return nullptr;
  21. // }
  22. if(root->left) root->left=pruneTree(root->left);
  23. if(root->right) root->right=pruneTree(root->right);
  24. if(root->left==nullptr&&root->right==nullptr&&root->val==0)
  25. //走到头才算是树枝当树枝被剪完了自己也就是树枝的。
  26. {
  27. //delete root;
  28. root=nullptr;
  29. // return nullptr;
  30. }
  31. return root;
  32. }
  33. };

9.验证二叉搜索树(注意剪枝

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. long long prev_val=LONG_MIN;
  15. bool isValidBST(TreeNode* root) {
  16. if(root==nullptr)
  17. {
  18. return true;
  19. }
  20. bool left=isValidBST(root->left);
  21. if(left==false) return false;//剪枝
  22. bool cur=false;
  23. if(root->val>prev_val)
  24. {
  25. prev_val=root->val;
  26. cur=true;
  27. }
  28. if(right==false) return false;//剪枝
  29. bool right=isValidBST(root->right);
  30. //cout<< root->val;
  31. return left&&right&&cur;
  32. }
  33. };

10. 二叉搜索树第k小的元素(二叉搜索树中序遍历是一个有序序列)

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. int count;
  15. int ret;
  16. int kthSmallest(TreeNode* root, int k) {
  17. count=k;
  18. return dfs(root);
  19. }
  20. int dfs(TreeNode* root)
  21. {
  22. if(root==nullptr){
  23. return ret;
  24. }
  25. ret=dfs(root->left);
  26. if(count==0)
  27. {
  28. return ret;
  29. }
  30. ret=root->val;
  31. count--;
  32. ret=dfs(root->right);
  33. return ret;
  34. }
  35. };

11. 二叉树的所有路径

12. 全排列

1.此处path设置为全局变量更好,虽然回溯时需要修改,但是节省一些空间并且效率更高。:

  1. class Solution {
  2. public:
  3. vector<vector<int>> ret;
  4. vector<bool> check;//用于记录哪些数字使用过了而达到剪枝的效果,回溯的时候需要把使用过的数字还回去
  5. vector<int> path;//这里的path最好使用全局变量
  6. vector<vector<int>> permute(vector<int>& nums) {
  7. check.resize(nums.size());
  8. dfs(nums,path);
  9. return ret;
  10. }
  11. void dfs(vector<int>& nums,vector<int> path)
  12. {
  13. if(nums.size()==path.size())
  14. {
  15. ret.push_back(path);
  16. return ;
  17. }
  18. for(int i=0;i<nums.size();i++)
  19. {
  20. if(check[i]==true)
  21. {
  22. continue;
  23. }
  24. check[i]=true;
  25. vector<int> tmp=path;
  26. tmp.push_back(nums[i]);
  27. dfs(nums,tmp);
  28. check[i]=false;
  29. }
  30. }
  31. };

2. 修改后:

  1. class Solution {
  2. public:
  3. vector<vector<int>> ret;
  4. vector<bool> check;//用于记录哪些数字使用过了而达到剪枝的效果,回溯的时候需要把使用过的数字还回去
  5. vector<int> path;//这里的path最好使用全局变量
  6. vector<vector<int>> permute(vector<int>& nums) {
  7. check.resize(nums.size());
  8. dfs(nums,path);
  9. return ret;
  10. }
  11. void dfs(vector<int>& nums,vector<int>& path)
  12. {
  13. if(nums.size()==path.size())
  14. {
  15. ret.push_back(path);
  16. return ;
  17. }
  18. for(int i=0;i<nums.size();i++)
  19. {
  20. if(check[i]==true)
  21. {
  22. continue;
  23. }
  24. check[i]=true;
  25. // vector<int> tmp=path;
  26. // tmp.push_back(nums[i]);
  27. path.push_back(nums[i]);
  28. dfs(nums,path);
  29. check[i]=false;//向下递归完后恢复现场
  30. path.pop_back();
  31. }
  32. }
  33. };

13. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

13. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. vector<string> ret;
  15. string path;
  16. int i=0;
  17. vector<string> binaryTreePaths(TreeNode* root)
  18. {
  19. if(root==nullptr) return ret;//假设会传入空,最好不要写在dfs函数里面
  20. dfs(root,path);
  21. return ret;
  22. }
  23. void dfs(TreeNode* root,string path)
  24. {
  25. path+=to_string(root->val);
  26. if(root->left==nullptr&&root->right==nullptr)
  27. {
  28. ret.push_back(path);
  29. return;
  30. }
  31. path+="->";
  32. if(root->left) dfs(root->left,path);
  33. if(root->right) dfs(root->right,path);//剪枝,并且达到了不会传入空的效果
  34. }
  35. };

14. 子集

  1. class Solution {
  2. public:
  3. vector<vector<int>> ret;
  4. vector<int> path;
  5. //vector<bool> check;
  6. vector<vector<int>> subsets(vector<int>& nums)
  7. {
  8. dfs(nums,0);
  9. return ret;
  10. }
  11. void dfs(vector<int>& nums ,int pos)
  12. {
  13. ret.push_back(path);
  14. for(int i=pos;i<nums.size();i++)
  15. {
  16. path.push_back(nums[i]);
  17. dfs(nums,i+1);
  18. path.pop_back();
  19. }
  20. }
  21. };

15. 异或和按位或分清楚

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. int ret;//返回值总和
  4. int tmp=0;//记录当前层异或的值
  5. int subsetXORSum(vector<int>& nums) {
  6. dfs(nums,0);
  7. return ret;
  8. }
  9. void dfs(vector<int>& nums,int pos)
  10. {
  11. ret+=tmp;
  12. for(int i=pos;i<nums.size();i++)
  13. {
  14. tmp^=nums[i];
  15. dfs(nums,i+1);
  16. tmp^=nums[i];
  17. }
  18. }
  19. };

16. 全排列 ||

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. vector<vector<int>> ret;
  4. vector<bool> check;
  5. vector<int> path;
  6. vector<vector<int>> permuteUnique(vector<int>& nums) {
  7. sort(nums.begin(),nums.end());
  8. check.resize(nums.size(),false);
  9. //没有上句会报错Line 84: Char 2: runtime error: store to null pointer of type 'std::_Bit_type' (aka 'unsigned long') (stl_bvector.h)
  10. dfs(nums);
  11. return ret;
  12. }
  13. void dfs(vector<int>& nums)
  14. {
  15. if(path.size()==nums.size())
  16. {
  17. ret.push_back(path);
  18. return;
  19. }
  20. for(int i=0;i<nums.size();i++)
  21. {
  22. if(check[i]==true ||( i!=0 && nums[i]==nums[i-1] && check[i-1] == false ))
  23. //check[i-1]==false;说明nums[i]和nums[i-1]同层进行判断比较。
  24. {
  25. continue;
  26. }
  27. check[i]=true;
  28. path.push_back(nums[i]);
  29. dfs(nums);
  30. check[i]=false;
  31. path.pop_back();
  32. }
  33. }
  34. };

17. 电话号码

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. vector<string> ret;
  4. string path;
  5. vector<string> hash={" ", " ", "abc", "def", "ghi","jkl","mno","pqrs","tuv","wxyz"};
  6. vector<string> letterCombinations(string digits)
  7. {
  8. if(digits.size()==0){
  9. return ret;
  10. }
  11. dfs(digits,0);
  12. return ret;
  13. }
  14. void dfs(string& digits,int pos)
  15. {
  16. if(path.size()==digits.size())
  17. {
  18. ret.push_back(path);
  19. return;
  20. }
  21. for(auto a: hash[digits[pos]-'0'] )
  22. {
  23. path.push_back(a);
  24. dfs(digits,pos+1);
  25. path.pop_back();
  26. }
  27. }
  28. };

18. 括号生成

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. int max;
  4. int left,right;
  5. vector<string> ret;
  6. string path;
  7. vector<string> generateParenthesis(int n)
  8. {
  9. max=n;
  10. dfs();
  11. return ret;
  12. }
  13. void dfs()
  14. {
  15. if(right == max)
  16. {
  17. ret.push_back(path);
  18. return;
  19. }
  20. if(left < max)
  21. {
  22. path.push_back('(');
  23. ++left;
  24. dfs();
  25. --left;
  26. path.pop_back();
  27. }
  28. if(right < left)
  29. {
  30. path.push_back(')');
  31. right++;
  32. dfs();
  33. right--;
  34. path.pop_back();
  35. }
  36. }
  37. };

19. 组合

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. int max;
  4. vector<int> path;
  5. vector<vector<int>> ret;
  6. vector<vector<int>> combine(int n, int k) {
  7. max=k;
  8. dfs(1,n);
  9. return ret;
  10. }
  11. void dfs(int pos,int& n)
  12. {
  13. if(path.size() == max )
  14. {
  15. ret.push_back(path);
  16. return;
  17. }
  18. for(int i=pos;i<n+1;++i)
  19. {
  20. path.push_back(i);
  21. dfs(i+1,n);//是要传入i+1而不是pos+1
  22. path.pop_back();
  23. }
  24. }
  25. };

20.目标和

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

注意单单int的反复加加减减还是非常耗时的,这里不是拷贝一个vector之类的对象,所以反而恢复现场的操作会更慢从而超时。

  1. class Solution {
  2. public:
  3. // int ret=0;
  4. // int path;
  5. // int now_target;
  6. // int findTargetSumWays(vector<int>& nums, int target)
  7. // {
  8. // now_target=target;
  9. // dfs(0,1,nums);
  10. // return ret;
  11. // }
  12. // void dfs(int pos,int level,vector<int>& nums)
  13. // {
  14. // if(nums.size()+1 == level)
  15. // {
  16. // if(path==now_target)
  17. // {
  18. // ret++;
  19. // }
  20. // return;
  21. // }
  22. // {
  23. // path+=nums[pos];
  24. // dfs(pos+1,level+1,nums);
  25. // path-=nums[pos];
  26. // }
  27. // {
  28. // path-=nums[pos];
  29. // dfs(pos+1,level+1,nums);
  30. // path+=nums[pos];
  31. // }
  32. // }
  33. int ret=0;
  34. //int path;
  35. int now_target;
  36. int findTargetSumWays(vector<int>& nums, int target)
  37. {
  38. int path=0;
  39. now_target=target;
  40. dfs(0,1,nums,path);
  41. return ret;
  42. }
  43. void dfs(int pos,int level,vector<int>& nums,int path)
  44. {
  45. if(nums.size()+1 == level)
  46. {
  47. if(path==now_target)
  48. {
  49. ret++;
  50. }
  51. return;
  52. }
  53. {
  54. //path+=nums[pos];
  55. dfs(pos+1,level+1,nums,path+nums[pos]);
  56. //path-=nums[pos];
  57. }
  58. {
  59. dfs(pos+1,level+1,nums,path-nums[pos]);
  60. }
  61. }
  62. };

21. 组合总和

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. //第一个位置的数选一个两个三个依次往下递归
  4. //第二个数也是如此
  5. //恢复现场时候要把本层push_back进去的所有数据全部pop_back出去
  6. vector<vector<int>> ret;
  7. vector<int> path;
  8. vector<vector<int>> combinationSum(vector<int>& candidates, int target)
  9. {
  10. dfs(candidates,0,target,0);
  11. return ret;
  12. }
  13. void dfs(vector<int>& candidates,int sum,const int& target,int pos)//sum为递归到本层的和
  14. {
  15. if(sum>=target)
  16. {
  17. if(sum==target)ret.push_back(path);
  18. return;
  19. }
  20. if(pos==candidates.size())//防止越界访问而导致的内存问题
  21. {
  22. return;
  23. }
  24. for(int i=0;sum+i*candidates[pos]<=target;i++)
  25. {
  26. //cout<<candidates[pos];
  27. if(i) path.push_back(candidates[pos]); //注意这个if(i)
  28. dfs(candidates,sum+i*candidates[pos],target,pos+1);
  29. }
  30. //cout<<endl;
  31. for(int i=1;sum+i*candidates[pos]<=target;i++)//上面的if(i)决定了这里从i==1开始删除
  32. {
  33. //cout<<candidates[pos];
  34. path.pop_back();
  35. }
  36. //cout<<endl;
  37. }
  38. };

此题还有另一种解法

就是每一个位置的数对其所有可能进行枚举

22. 字母大小写全排列

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. string path;
  4. vector<string> ret;
  5. vector<string> letterCasePermutation(string s)
  6. {
  7. dfs(0,s);
  8. return ret;
  9. }
  10. void dfs(int pos,const string& s)
  11. {
  12. if(pos==s.size())
  13. {
  14. ret.push_back(path);
  15. return;
  16. }
  17. char tmp=s[pos];
  18. path.push_back(tmp);
  19. dfs(pos+1,s);
  20. path.pop_back();
  21. if(tmp<'0'||tmp>'9')//如果是字符
  22. {
  23. change(tmp);
  24. path.push_back(tmp);
  25. dfs(pos+1,s);
  26. path.pop_back();
  27. }
  28. }
  29. void change(char& ch)
  30. {
  31. if(ch>='a'&&ch<='z')//这里的-= +=l弄错了
  32. {
  33. ch-=32;
  34. }
  35. else if(ch>='A'&&ch<='Z')
  36. {
  37. ch+=32;
  38. }
  39. }
  40. };

23. 优美的排列

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

  1. class Solution {
  2. public:
  3. vector<int> path;
  4. int ret;
  5. vector<bool> check;
  6. int max=0;
  7. int countArrangement(int n) {
  8. check.resize(n+1,false);
  9. path.resize(n+1);
  10. max=n;
  11. dfs(1);
  12. return ret;
  13. }
  14. void dfs(int pos)
  15. {
  16. if(max==pos)
  17. {
  18. ++ret;
  19. return;
  20. }
  21. for(int i=1;i<max+1;i++)
  22. {
  23. if(check[i]==true)
  24. {
  25. continue;
  26. }
  27. if(pos%i==0||i%pos==0)
  28. {
  29. check[i]=true;
  30. path.push_back(i);
  31. dfs(pos+1);
  32. path.pop_back();
  33. check[i]=false;
  34. }
  35. }
  36. }
  37. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/434276
推荐阅读
相关标签
  

闽ICP备14008679号