一、递归实现全排列

 #include"cstdio"
int A[];
void print_permutation(int n,int *A,int cur){
if(cur==n){
for(int i=;i<n;i++)
printf("%d",A[i]);
printf("\n");
}
else for(int j=;j<n+;j++){
int ok=;
for(int k=;k<cur;k++)
if(A[k]==j)
ok=;
if(ok){
A[cur]=j;
print_permutation(n,A,cur+);
}
}
}
int main(){
int n;
scanf("%d",&n);
print_permutation(n,A,);
return ;
}

二、解答树

     #include <string.h>
#include <iostream> using namespace std;
const int N = ; //输入排序的个数的最大值
int record[N]; //记录每次排序的序列
int visited[N]; //标记节点是否被访问过
int n; //输入节点的数目
int totalSize = ;
void DFS(int start){
if(start>=n){ //递归出口
for(int i=;i<n;i++){
cout<<record[i]<<" ";
}
totalSize++;
cout<<endl;
return;
}
for(int i=;i<=n;i++){ //深度遍历节点,并标记已经访问过的节点
if(visited[i]==){
visited[i] = ;
record[start] = i;
DFS(start+); //递归遍历
visited[i] = ; //回退时标记回退的节点为未被访问节点
}
}
} int main()
{
cin>>n;
memset(visited,,n);
DFS();
cout<<"totalSize = "<<totalSize<<endl;
return ;
}

三、

调用next_permutation()方法

四、回溯法总结

1、八皇后问题代码

 #include<iostream>
#include<math.h>
using namespace std;
int n=8; int rows[];//存储n行的第几列
int j=;
bool Is(int row){
for(int i=;i<row+;i++){
if(rows[row-i]==rows[row]-i||rows[row-i]==rows[row]+i||rows[row]==rows[row-i])
return false;
}
return true;
}
void start(int row){
if(row==n)
j++;
else {
for(int col=;col<n;col++){
rows[row]=col;
if(Is(row)){
printf("%d %d\n",row,rows[row]);
start(row+);
}
}
}
}
int main(){
start();
printf("%d\n",j);
return ;
}

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

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]用go语言实现区块链工作原理

    基本原理这里就不写了,只写一个简单demo的实现 首先得有一个区块用来存储区块头和区块体 type Block struct { Version int64 PreBlockHash []byte H ...

  2. oracle imp使用

    1. 获取帮助 imp help=y 2. 导入一个完整数据库 imp system/manager file=bible_db log=dible_db full=y ignore=y 3. 导入一 ...

  3. 【转载】redis优化配置和redis.conf说明

    转载地址:http://blog.csdn.net/luozhonghua2014/article/details/40568707?utm_source=tuicool&utm_medium ...

  4. eclipse Subversion Native Library Not Available

    参考:http://blog.csdn.net/zp357252539/article/details/44880319 Subversion Native Library Not Available ...

  5. jquery 常用工具方法

    inArray(value, array [, fromIndex ])方法类似于原生javascript的indexOf()方法,没有找到匹配元素时它返回-1.如果数组第一个元素匹配参数,那么$.i ...

  6. Linux软件包的管理

    RPM软件包 RPM软件包一般的安装位置(分散): 管理程序:/sbin/* /usr/sbin/* 普通用户程序:/bin/* /usr/bin/* rpm -q ===> rpm -quer ...

  7. 编写高质量代码改善C#程序的157个建议——建议103:区分组合和继承的应用场合

    建议103:区分组合和继承的应用场合 继承所带来的多态性虽然是面向对象的一个重要特性,但这种特性不能在所有的场合中滥用.继承应该被当做设计架构的有用补充,而不是全部. 组合不能用于多态,但组合使用的频 ...

  8. linux 系统启动

    系统启动流程 BIOS 我们称之为基本输入输出系统,一般保存在主板上的BIOS芯片中,负责检查硬件并且查找可启动设备:可设置启动顺序: 如果一个设备是可启动,那么第一个扇区512字节的最后两字节是55 ...

  9. delphi edit边框成为下划线

    设置它的几个属性:BevelEdges    |_ beLeft = False;    |_ beTop   = False;    |_ beRight = False;    |_ beBott ...

  10. replaceState 实现返回从新定位

    在web 开发中,选择列表分类,在中商品, 详情页面后,返回的时候我们想定位到原来选择的分类 就需要借助window.history.replaceState来实现 function getProdu ...