#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. Oracle单行函数。。。

    单行函数 --字符函数--1.ASCII 返回与指定的字符对应的十进制数;select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') spa ...

  2. JS 分页实现

    var pagesize = 5; var pageindex = 1; var pagetype; var parms; var nextSize = 1; var target; function ...

  3. 19.CentOS7下PostgreSQL安装过程

    CentOS7下PostgreSQL安装过程 装包 sudo yum install postgresql-server postgresql-contrib 说明: 这种方式直接明了,其他方法也可以 ...

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

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

  5. selenium+phantomjs报错:Unable to find a free port的分析和解决

    selenium+phantomjs报错:Unable to find a free port的分析和解决 Table of Contents 1. 现象 2. 分析 3. 解决办法 1 现象 在做项 ...

  6. JavaScript获取URL参数公共方法

    写一个JavaScript获取URL参数的通用方法,可以把它放到常用方法的JS文件中调用,直接上代码例子,新手可以学习一下! <!DOCTYPE html> <html lang=& ...

  7. mysql用户权限操作

    mysql用户权限操作1.创建用户mysql -urootcreate database zabbix default charset utf8;grant all on zabbix.* to za ...

  8. python数据类型、输入输出、运算符、条件判断、循环

    变量以及类型 变量:存储程序运行中的数据,变量有3个要素:变量名.变量类型.变量值.python属于弱类型语言,不需要声明变量类型. [root@localhost python]# ipython3 ...

  9. 360、IE等浏览器对bootstrap的影响

    笔者开发的web程序部署上线后发现,bootstrap的菜单不显示,开发时候用chrome没有发现问题,在360浏览器上跑,发现360默认的是兼容模式,切换到极速模式就能够显示菜单了. 但是这样的用户 ...

  10. PHP数组排序方法总结

    随着PHP的快速发展,用它的人越来越多,在PHP数组学习摘录部分了解到最基本的PHP数组的建立和数组元素的显示.需要深入学习下PHP数组的相关操作.首先接触的就是PHP数组排序.降序的排序问题. so ...