一、递归实现全排列

  1. #include"cstdio"
  2. int A[];
  3. void print_permutation(int n,int *A,int cur){
  4. if(cur==n){
  5. for(int i=;i<n;i++)
  6. printf("%d",A[i]);
  7. printf("\n");
  8. }
  9. else for(int j=;j<n+;j++){
  10. int ok=;
  11. for(int k=;k<cur;k++)
  12. if(A[k]==j)
  13. ok=;
  14. if(ok){
  15. A[cur]=j;
  16. print_permutation(n,A,cur+);
  17. }
  18. }
  19. }
  20. int main(){
  21. int n;
  22. scanf("%d",&n);
  23. print_permutation(n,A,);
  24. return ;
  25. }

二、解答树

  1. #include <string.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. const int N = ; //输入排序的个数的最大值
  6. int record[N]; //记录每次排序的序列
  7. int visited[N]; //标记节点是否被访问过
  8. int n; //输入节点的数目
  9. int totalSize = ;
  10. void DFS(int start){
  11. if(start>=n){ //递归出口
  12. for(int i=;i<n;i++){
  13. cout<<record[i]<<" ";
  14. }
  15. totalSize++;
  16. cout<<endl;
  17. return;
  18. }
  19. for(int i=;i<=n;i++){ //深度遍历节点,并标记已经访问过的节点
  20. if(visited[i]==){
  21. visited[i] = ;
  22. record[start] = i;
  23. DFS(start+); //递归遍历
  24. visited[i] = ; //回退时标记回退的节点为未被访问节点
  25. }
  26. }
  27. }
  28.  
  29. int main()
  30. {
  31. cin>>n;
  32. memset(visited,,n);
  33. DFS();
  34. cout<<"totalSize = "<<totalSize<<endl;
  35. return ;
  36. }

三、

调用next_permutation()方法

四、回溯法总结

1、八皇后问题代码

  1. #include<iostream>
  2. #include<math.h>
  3. using namespace std;
  4. int n=8; int rows[];//存储n行的第几列
  5. int j=;
  6. bool Is(int row){
  7. for(int i=;i<row+;i++){
  8. if(rows[row-i]==rows[row]-i||rows[row-i]==rows[row]+i||rows[row]==rows[row-i])
  9. return false;
  10. }
  11. return true;
  12. }
  13. void start(int row){
  14. if(row==n)
  15. j++;
  16. else {
  17. for(int col=;col<n;col++){
  18. rows[row]=col;
  19. if(Is(row)){
  20. printf("%d %d\n",row,rows[row]);
  21. start(row+);
  22. }
  23. }
  24. }
  25. }
  26. int main(){
  27. start();
  28. printf("%d\n",j);
  29. return ;
  30. }

总结:在全排列和八皇后问题中,均使用了递归回溯。其格式大致为

void f(){

If(){//符合要求的一组解求出后

  count++

}else{

      For(int ....){

       f();//递归调用

    }

  }

}

C语言实现全排列和回溯法总结的更多相关文章

  1. Leetcode之回溯法专题-47. 全排列 II(Permutations II)

    Leetcode之回溯法专题-47. 全排列 II(Permutations II) 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2] ...

  2. Leetcode之回溯法专题-46. 全排列(Permutations)

    Leetcode之回溯法专题-46. 全排列(Permutations) 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3, ...

  3. C语言递归回溯法迷宫求解

    本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...

  4. uva216 c++回溯法

    因为题目要求最多8台电脑,所以可以枚举全排列,然后依次计算距离进行比较,枚举量8!=40320并不大,但这种方法不如回溯法好,当数据再大一些枚举就显得笨拙了,所以这个题我用回溯法做的,回溯有一个好处是 ...

  5. 使用回溯法求所有从n个元素中取m个元素的组合

    不多说了,直接上代码,代码中有注释,应该不难看懂. #include <stdlib.h> #include <stdio.h> typedef char ELE_TYPE; ...

  6. python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题

    问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...

  7. python 回溯法 记录

    一直不是太理解回溯法,这几天集中学习了一下,记录如下. 回溯法有"通用的解题法"之称. 1.定义:  也叫试探法,它是一种系统地搜索问题的解的方法. 2.基本思想:  从一条路往前 ...

  8. USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

  9. 回溯法、DFS

    回溯法 为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回上一步重新选择条件,继续向前探索,如此反复进行,直至得到解或证明无解. DFS DFS模板 vo ...

随机推荐

  1. [GO]非结构体匿名字段

    package main import ( "fmt" ) type mystr string //给一个类型重命名 type Person struct { name strin ...

  2. HDU 6162 Ch’s gift (线段树+树链剖分)

    题意:给定上一棵树,每个树的结点有一个权值,有 m 个询问,每次询问 s, t ,  a, b,问你从 s 到 t 这条路上,权值在 a 和 b 之间的和.(闭区间). 析:很明显的树链剖分,但是要用 ...

  3. HDU 4126 Genghis Khan the Conqueror (树形DP+MST)

    题意:给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可疑的边出现的概率相同,求不能经过原来可疑边 (可以经过可疑边新的花费构建的边),注意每次只出现一条可疑的边,n个 ...

  4. [Lua快速了解一下]Lua的model

    我们可以直接使用require(“model_name”)来载入别的lua文件,文件的后缀是.lua.载入的时候就直接执行那个文件了.比如: 我们有一个hello.lua的文件: print(&quo ...

  5. Mysql自动设置时间(自动获取时间,填充时间)

    应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,不需要应用程序去特意记录,而由数据数据库获取当前时间自动记录创建时间: 2.在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意 ...

  6. MFC中按钮控件的用法笔记(转)

    VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1:则m_Button1.EnableWindow(true); 使按钮 ...

  7. php数组倒叙支持多维数组

    <?php //一维数组 $test1 = array("a"=>"苹果","b"=>"香蕉",&qu ...

  8. C++友元(友元函数、友元类和友元成员函数)

    友元(友元函数.友元类和友元成员函数) C++ 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私 ...

  9. Spring Boot - Spring Async

    除了使用Thread.Runnable.TimerTask.FeatureTask.CompletableFuture等类,在Spring Boot中还可以使用注解创建异步任务,可以减少线程处理的代码 ...

  10. I-team 博客的 gitlab-runner 持续集成实践

    做为一个略微看过nodejs语法,但又不懂nodejs的攻城狮,搭建hexo环境很是麻烦,要考虑到FQ版本兼容等问题.于是乎,博主每换一个电脑,为了能继续发博客,都需要在新电脑上花一天时间重新搞一下 ...