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> ...
随机推荐
- 图片单独上传 (word)
Word.ApplicationClass wordApp=new ApplicationClass(); object file=path; object nullobj=System.Reflec ...
- erlang通讯解析浮点数的一些问题
这两天我弟弟遇到一个比较有意思的问题.他在前端协定数据协议的时候用到了float和double,所以他想问float和double在erlang后端中是如何解析的.我之前写协议也很少用到浮点数,所以也 ...
- OO 第三单元总结
1. JML梳理 根据JML LEVEL 0手册梳理常用条目 1.1 JML 理论基础 \result表达式 : 表示方法返回值 \old( expr )表达式:表示方法执行之前expr表达式取值,若 ...
- python随笔---录入月份的值,输出对应的季节
首先获取一个输入,加判断,输入对应的月份,季节判定根据气象划分法(气象划分法:在气象部门,通常以阳历3-5月为春季,6-8月为夏季,9-11月为秋季,12月-来年2月为冬季,并且常常把1.4.7.10 ...
- 移动端真机调试工具--DebugGap (VIDE)
越来越多的移动端开发工作,需要我们有一个好的调试工具,以解决各类真机才会遇到的BUG,最近使用了一款DebugGap 的工具,非常方便,在这里推荐给大家. 官网地址 DebugGap . 按需求下载 ...
- 自己实现的简单的grid
12年在第一家公司的时候,有过很长一段时间在前端的使用研究上.一开始的时候使用ExtJs4.0 MVC 来开发前端,觉得里面的风转的组件非常好用,Panel.window.tree等等,简化了对于前端 ...
- 虚拟机中Ubuntu安装vmtools
1.解压vmtools文件为VMWARETO.TGZ VMtools文件一般在系统桌面,如果没有可以点击左上方的"虚拟机-安装VMware Tools"即可出现在桌面,也可以通过U ...
- 使用Eclipse连接SAP云平台上的HANA数据库实例
SAP云平台(Cloud Platform)上的HANA数据库实例有两种方式访问: 1. 通过SAP云平台的基于网页版的Development Tool:SAP HANA Web-Based Deve ...
- OpenGL glReadPixels 转成 CImage
本来是一件很简单的事情,就是将View上使用OpenGL画出来的数据生成图片让其实现打印的功能,我们知道MFC提供打印的接口是不支持OpenGL的(至少我不清楚),必须将它转成GDI再画在Print的 ...
- vue中使用setTimeout
在vue的函数中使用setTimeout self.distroyTimeout = setTimeout(()=>{ self.initData() },1000) 这时清除setTimeou ...