#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. java中调用ElasticSearch中文分词ik没有起作用

    问题描述: 项目中已经将'齐鲁壹点'加入到扩展词中,但是使用客户端调用的时候,高亮显示还是按照单个文字分词的: 解决方案: 1.创建Mapping使用的分词使用ik 2.查询使用QueryBuilde ...

  2. 用命令行的方式将本地项目上传到git

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  3. 几百道常见Java初中级面试题

     注:  有的面试题是我面试的时候遇到的,有的是偶然看见的,还有的是朋友提供的, 稍作整理,以供参考.大部分的应该都是这些了,包含了基础,以及相对深入一点点的东西.   JAVA面试题集 基础知识: ...

  4. <Android 应用 之路> 天气预报(五)

    前言 写了上一篇文章,讲了下这个实现天气预报的使用内容,现在又到了看代码的时候,主要还是贴代码,然后添加足够的注释. 聚合数据SDK配置 将juhe_sdk_v_X_X.jar以及armeabi文件夹 ...

  5. Eucalyptus-NC管理

    1.前言 Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) ...

  6. SQL Server 08版与14版处理重复行的方式

    在项目中,利用循环拼接成了插入多行数据的SQL语句: Insert into table(col1,col2)vaules(value11,value21); Insert into table(co ...

  7. web调试的一些小技巧

    1.不带缓存的刷新,用于刷新css或者js:Ctrl+F5 待续...

  8. [VC]strcpy和strncoy的区别

    第一种情况:char* p="how are you ?";char name[20]="ABCDEFGHIJKLMNOPQRS"; strcpy(name,p ...

  9. World Wind Java开发之八——加载本地缓存文件构建大范围三维场景(

    http://blog.csdn.net/giser_whu/article/details/42044599 上一篇博客主要是针对小文件直接导入WW中显示,然而当文件特别大时,这种方式就不太可行.因 ...

  10. python_48_Python3中字符编码与转码

    python3默认是Unicode,不用声明# -*- coding:utf-8 -*-,如果声明则是utf-8 unicode='你好' print('utf-8:',unicode.encode( ...