C语言实现全排列和回溯法总结
一、递归实现全排列
#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语言实现全排列和回溯法总结的更多相关文章
- Leetcode之回溯法专题-47. 全排列 II(Permutations II)
Leetcode之回溯法专题-47. 全排列 II(Permutations II) 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2] ...
- Leetcode之回溯法专题-46. 全排列(Permutations)
Leetcode之回溯法专题-46. 全排列(Permutations) 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3, ...
- C语言递归回溯法迷宫求解
本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...
- uva216 c++回溯法
因为题目要求最多8台电脑,所以可以枚举全排列,然后依次计算距离进行比较,枚举量8!=40320并不大,但这种方法不如回溯法好,当数据再大一些枚举就显得笨拙了,所以这个题我用回溯法做的,回溯有一个好处是 ...
- 使用回溯法求所有从n个元素中取m个元素的组合
不多说了,直接上代码,代码中有注释,应该不难看懂. #include <stdlib.h> #include <stdio.h> typedef char ELE_TYPE; ...
- python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题
问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...
- python 回溯法 记录
一直不是太理解回溯法,这几天集中学习了一下,记录如下. 回溯法有"通用的解题法"之称. 1.定义: 也叫试探法,它是一种系统地搜索问题的解的方法. 2.基本思想: 从一条路往前 ...
- USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)
Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...
- 回溯法、DFS
回溯法 为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回上一步重新选择条件,继续向前探索,如此反复进行,直至得到解或证明无解. DFS DFS模板 vo ...
随机推荐
- javascript总结21:javascript-JSON与遍历
1 什么是JSON JavaScript Object Notation(JavaScript对象表示形式) JavaScript的子集 JSON和对象字面量的区别 JSON的属性必须用双引号引号引起 ...
- makeword()
MAKEWORD(学习之用,转载) MAKEWORD 宏 平台:SDK 这个宏创建一个被指定变量连接而成的WORD变量.返回一个WORD变量. (注:typedef unsigned short WO ...
- modelsim使用常见问题及解决办法集锦③
四.You selected Modelsim-Altera as Simulation Software in EDA Tool Settings,however…… You selected Mo ...
- 一类适合初学者的DP:最大子段和与最大子矩阵
最近在水简单DP题,遇到了两道层层递进的DP题,于是记录一下 一.最大子段和 题意: 给出一个长度为n(n<=1e5)的序列,求连续子段的最大值 比如说2 3 -4 5 的最大值是6 而 2 ...
- 解决Hbuilder打包的apk文件按手机返回键直接退出软件
问题描述:Hbuilder打包的app如果点击手机返回键,app会直接退出,返回不了上一页. 写在公共js文件中,每个页面均引入该js,代码如下: document.addEventListener( ...
- ubuntu 跑.net core 2.0
安装.net core参考地址:http://www.microsoft.com/net/core/preview#linuxubuntu 服务器版本 UBbuntu 16.04 执行命令 ...
- IoC概要
控制反转基本上说的是功能调用者与功能实现者之间应该如何交互,即二者之间没有直接的强耦合(调用者new一个被调用者),而是都依赖同一个抽象,这个抽象规定了二者交互的接口.反转的意思是实现了依赖倒置,在程 ...
- Redis协议规范(译文)
Redis客户端使用名为RESP(Redis序列化协议)的协议与Redis服务器进行通信. 虽然该协议是专为Redis设计的,但它可以用于其他CS软件项目的通讯协议. RESP是以下几方面的考虑: 易 ...
- 树状数组套trie 模板
求区间排名,第K大,单点修改,区间前驱,区间后驱. 时间复杂度O(logn^3) #include<iostream> #include<cstdio> #include< ...
- php与java的差异
http://zhidao.baidu.com/link?url=kd-eulWPoygRlMKeBxdCn3QA4bLJXYVSc_mUGPgWg05az8RIqu3r1GmRnmXZ4UMaR6y ...