dfs 的全排列
#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 的全排列的更多相关文章
- DFS实现全排列
复习一下DFS实现全排列,具体思想见:https://www.cnblogs.com/chiweiming/p/9279858.html public class Main{ static int a ...
- (DFS、全排列)POJ-2718 Smallest Difference
题目地址 简要题意: 给若干组数字,每组数据是递增的在0--9之间的数,且每组数的个数不确定.对于每组数,输出由这些数组成的两个数的差的绝对值最小是多少(每个数出现且只出现一次). 思路分析: 对于n ...
- DFS 之 全排列
题目描述输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 我们可以模拟出n个盒子和n张卡片,我们需要将n张卡片分别放到n个盒子里,且每个盒子只能放1张卡 ...
- 用DFS 解决全排列问题的思想详解
首先考虑一道奥数题目: □□□ + □□□ = □□□,要将数字1~9分别填入9个□中,使得等式成立.例如173+286 = 459.请输出所有合理的组合的个数. 我们或许可以枚举每一位上所有的数,然 ...
- C++DFS方法全排列
前几天看纪磊的<啊哈!算法>一书,里面讲算法讲的特别通俗细致,真的是初中生都能读得懂的算法书(我大二才读:P).这段代码很适合初学算法的同学. #include<iostream&g ...
- (DFS、全排列)POJ-3187 Backward Digit Sums
题目地址 简要题意: 输入两个数n和m,分别表示给你1--n这些整数,将他们按一定顺序摆成一行,按照杨辉三角的计算方式进行求和,求使他们求到最后时结果等于m的排列中字典序最小的一种. 思路分析: 不难 ...
- DFS输出全排列
前言 输入n(1 <= n <= 20),按字典序输出所有1~n的排列.如果排列数量太多,则只需要输出前100个 输入样例 3 输出样例 1 2 3 1 3 2 2 1 3 2 3 1 3 ...
- 洛谷 P1706 全排列问题 :STL / dfs
题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...
- DFS+模拟 ZOJ 3861 Valid Pattern Lock
题目传送门 /* 题意:手机划屏解锁,一笔连通所有数字,输出所有可能的路径: DFS:全排列 + ok () 判断函数,去除一些不可能连通的点:) */ #include <cstdio> ...
随机推荐
- 无需控件直接导出xls(csv)
/// <summary> /// 执行导出 /// </summary> /// <param name="ds">要导出的DataSet&l ...
- mybatis-plus 异常 Invalid bound statement (not found)
最近吧项目中添加使用了mybatis-plus,发现操作sql的时候出现异常: Invalid bound statement (not found) ,异常位置位于mybatis-plus的jar中 ...
- 前端js优化方案(一)
最近在读<高性能javascript>,在这里记录一下读后的一些感受,顺便加上自己的一些理解,如果有兴趣的话可以关注的我的博客http://www.bloggeng.com/,我会不定期发 ...
- ngnix反向代理
https://blog.csdn.net/sherry_chan/article/details/79055211
- 分享几道经典的javascript面试题
这几道题目还是有一点意思的,大家可以研究一番,对自己的技能提升绝对有帮助. 1.调用过程中输出的内容是什么 function fun(n, o) { console.log(o); return { ...
- zblog去除文章页作者信息
不想让zblog文章页显示作者信息怎么办? 1. 找到文章页模板文件:/zb_users/theme/default/template/post-single.php,删除相关代码 <span ...
- Linux常用命令-1
内部命令:属于Shell解释器的一部分(已调入内存) 外部命令:独立于Shell解释器之外的程序文件(在磁盘上) 获得命令帮助 1)内部命令help 查看Bash内部命令的帮助信息 2)命令的“--h ...
- vue组件总结(三)
一.什么是组件 组件(component)是Vue最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码,根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己的需要 ...
- 为当前导航添加active样式
判断当前页面为哪个导航链接 if(window.loacation.href.indexOf(linkurl) != -1){ link[i].className = 'active' }
- SpringBoot学习记录(一)
1. Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1. @Configuration 和 @Bean Spring的Java配置方式是 ...