#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <string>
#include <cstring>
#include <map>
#include <utility>
using namespace std;
const int N = 1e2+ ;
bool vis[N];
int a[N],n;
void dfs(int num,int n){
if(num==n){
for(int i =;i<n;i++){
printf("%d%c",a[i],i==n-?'\n':' ');
}
return ;
}
for(int i=;i<=n;i++){
if(!vis[i]){
vis[i]=;
a[num]=i;
dfs(num+,n);
vis[i]=;
}
}
}
int main()
{
while(~scanf("%d",&n)){
memset(vis,,sizeof(vis));
dfs(,n);
}
return ;
}
 //用于生成全排列的函数
int a[N],n;
void init()
{
for(int i=;i<;i++){
a[i]=i+;
}
}
int main()
{
init();
int cnt=;
do{
for(int i=;i<;i++)
printf("%d%c",a[i],i==?'\n':' ');
cnt++;
}while(next_permutation(a,a+));
printf("%d\n",cnt);
return ;
}
 //从1到n取出m个数
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <string>
#include <cstring>
#include <map>
#include <utility>
using namespace std;
const int N = 1e2+ ;
bool vis[N];
int n,m,a[N];
void dfs(int num,int n){
if(num==m+){
for(int i =;i<=m;i++)
{
printf("%d%c",a[i],i==m?'\n':' ');
}
return ;
}
for(int i =a[num-]+;i<=n;i++){
if(!vis[i]){
vis[i]=;
a[num]=i;
dfs(num+,n);
vis[i]=;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)){
memset(vis,,sizeof(vis));
dfs(,n);
}
return ;
}
 //有重复字符的全排列

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e3+;
char s[N],buf[N];
int l;
bool vis[N];
void dfs(int num){
if(num==l){
printf("%s\n",buf);
return ;
}
for(int i =;i<l;i++){
if(!vis[i]){
int j;
for(j=i+;j<l;j++){
if(vis[j]&&s[i]==s[j]){//重复:先用了s靠后的字符又满足字符一样
break;
}
}
if(j==l){
vis[i]=;
buf[num]=s[i];
dfs(num+);
vis[i]=;
}
}
} }
int main()
{
while(~scanf("%s",s)){
memset(vis,,sizeof(vis));
l =strlen(s);
buf[l]='\0';
dfs();
}
return ;
}
 //hdu   1016

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e2+;
int n;
bool vis[N];
int a[N];
bool prime(int n){
if(n==) return false;
for(int i =;i*i<=n;i++){
if(n%i==) return false;
}
return true;
}
void dfs(int num,int n){
if(num==n&&prime(+a[n-])){
for(int i =;i<n;i++){
printf("%d%c",a[i],i==n-?'\n':' ');
}
return ;
}
for(int i=;i<=n;i++){//1一定是第一个
if(!vis[i]&&prime(i+a[num-])){
vis[i]=;
a[num]=i;
dfs(num+,n);
vis[i]=;
}
}
}
int f=;
int main()
{
while(~scanf("%d",&n)){
memset(vis,,sizeof(vis));
a[]=;
printf("Case %d:\n",f++);
dfs(,n);
printf("\n");
}
return ;
}
 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<vector>
#include <cstdlib>
#include <map>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 2e5+;
pair<int,int>P;
vector<int> ve[N];
vector<pair<int,int> > que[N];
int a[N],b[N];
int m;
int n,sum;
bool vis[N];
int cnt = ;
map<int,int>mp;
//从数组b里面取出若干个数,令其和为110
void dfs(int num,int n){
{
if(num<=n&&sum==)
{ for(int j=;j<=num-;j++){
printf("%d ",a[j]);
}
printf(":: %d \n",sum); return ;
}
for(int i =mp[a[num-]]+;i<=n;i++){
if(!vis[i]){
vis[i] = ;
a[num]= b[i];
sum+=b[i];
dfs(num+,n);
vis[i] = ;
sum-=b[i];
}
}
}
}
int main()
{
sum =;
mp[]=;
// scanf("%d%d",&n,&m);
scanf("%d",&n);
for(int i =;i<=n;i++){
scanf("%d",&b[i]);
mp[b[i]] =i;
}
dfs(,n);
return ;
}

dfs 的全排列的更多相关文章

  1. DFS实现全排列

    复习一下DFS实现全排列,具体思想见:https://www.cnblogs.com/chiweiming/p/9279858.html public class Main{ static int a ...

  2. (DFS、全排列)POJ-2718 Smallest Difference

    题目地址 简要题意: 给若干组数字,每组数据是递增的在0--9之间的数,且每组数的个数不确定.对于每组数,输出由这些数组成的两个数的差的绝对值最小是多少(每个数出现且只出现一次). 思路分析: 对于n ...

  3. DFS 之 全排列

    题目描述输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 我们可以模拟出n个盒子和n张卡片,我们需要将n张卡片分别放到n个盒子里,且每个盒子只能放1张卡 ...

  4. 用DFS 解决全排列问题的思想详解

    首先考虑一道奥数题目: □□□ + □□□ = □□□,要将数字1~9分别填入9个□中,使得等式成立.例如173+286 = 459.请输出所有合理的组合的个数. 我们或许可以枚举每一位上所有的数,然 ...

  5. C++DFS方法全排列

    前几天看纪磊的<啊哈!算法>一书,里面讲算法讲的特别通俗细致,真的是初中生都能读得懂的算法书(我大二才读:P).这段代码很适合初学算法的同学. #include<iostream&g ...

  6. (DFS、全排列)POJ-3187 Backward Digit Sums

    题目地址 简要题意: 输入两个数n和m,分别表示给你1--n这些整数,将他们按一定顺序摆成一行,按照杨辉三角的计算方式进行求和,求使他们求到最后时结果等于m的排列中字典序最小的一种. 思路分析: 不难 ...

  7. DFS输出全排列

    前言 输入n(1 <= n <= 20),按字典序输出所有1~n的排列.如果排列数量太多,则只需要输出前100个 输入样例 3 输出样例 1 2 3 1 3 2 2 1 3 2 3 1 3 ...

  8. 洛谷 P1706 全排列问题 :STL / dfs

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...

  9. DFS+模拟 ZOJ 3861 Valid Pattern Lock

    题目传送门 /* 题意:手机划屏解锁,一笔连通所有数字,输出所有可能的路径: DFS:全排列 + ok () 判断函数,去除一些不可能连通的点:) */ #include <cstdio> ...

随机推荐

  1. liunx下文件授权可执行权限chmod

    Cannot find ./catalina.sh The file is absent or does not have execute permission This file is needed ...

  2. Table中采用JQuery slideToggle效果的问题

    需求:用JQuery实现,点击最上边的粗加号时,对所有含有子表的Tr进行展开,点击 + 号时,只对当前Tr的下一个tr内容的动态隐藏和显示: 问题:JQuery的slideToggle() slide ...

  3. Yii2.0 高级版安装 windows

    最近在学习yii2.0 在安装高级版的时候遇到一些问题 索性解决了 下面分享一下 一.关于下载 自行百度,在Yii Framework 中文社区 下载专区下载高级应用程序模板(这边下载用电信网络不用下 ...

  4. Android 从零开始搭建一个主流项目框架—RxJava2.0+Retrofit2.0+OkHttp

    我这里的网络请求是用的装饰者模式去写的,什么是装饰者模式呢?在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.我的理解就是一个接口, ...

  5. 【extjs6学习笔记】0.4 准备: 书籍与文档

    Ext JS 6 By Example Ext JS Essentials Learning Ext JS - Fourth Edition Ext JS 6: Getting Started htt ...

  6. window.returnValue使用方法

    returnValue是javascript中html的window对象的属性,目的是返回窗口值,当用window.showModalDialog函数打开一个IE的模式窗口(模式窗口知道吧,就是打开后 ...

  7. Hyper-V 2016 配置管理系列(应用篇)

    远程连接到Hyper-V HOST 为了日常运维管理操作,使用远程PowerShell工作.Windows 10上安装了RSAT(远程管理工具 ).然后安装了Hyper-V控制台: 在能够远程连接到H ...

  8. Head First Python 读书笔记

    记录一下这段时间看<Head First Python>记录的一些小知识,只是记了很少一部分,有需要的话以后再添加吧. for循环的使用: for 目标标识符 in 列表: 处理代码 if ...

  9. linux 命令——8 cp (转)

    cp 命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在, 就会询问是否覆盖,不管你是否使用-i参数.但是如 ...

  10. Airflow 调度基础

    1. Airflow Airflow是一个调度.监控工作流的平台.用于将一个工作流制定为一组任务的有向无环图(DAG),并指派到一组计算节点上,根据相互之间的依赖关系,有序执行. 2. 安装 pip安 ...