无重复元素的全排列

输入n(<=11),按从小到大输出数字1 到n 个的全部排列。
样例:
输入:
3
输出:
1:1 2 3
2:1 3 2
3:2 1 3
4:2 3 1
5:3 1 2
6:3 2 1

全排列可以用STL来写,但为了强化dfs,就用 dfs 吧。

看了某一个pdf,我对搜索有了一个更深的认识。就是关于如何去dfs,我认为可以从这两方面想:一是能否转化为图的问题,二是能否画出搜索树。只要这两种有一个能想出来,那么dfs就一定能写出来。

而能否转化成图的这类题目,一般元素都是固定的,也就是说,图上的结点就固定了。就比如说这个全排列,元素就是1到n固定不变,那么这1到n个数就可以转化成图上的n个结点,其中每两个点之间都连一条边,然后不重复的遍历所有的点就行了。

既然这个图都能想出来,那搜索树就一定能画出来了,这里就不讲了。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i, a, n) for(int i = a; i <= n; ++i)
#define per(i, n, a) for(int i = n; i >= a; --i)
typedef long long ll;
int n, ans[], tot = ;
int vis[];
void print(int x)
{
printf("%d:", x);
rep(i, , n) printf("%d ", ans[i]); printf("\n");
}
void solve(int x, int step)
{
ans[step] = x; vis[x]= ;
if(step == n) print(++tot);
rep(i, , n)
{
if(!vis[i])
{
solve(i, step + );
vis[i] = ;
}
}
} int main()
{
// freopen("p1.in", "r", stdin);
// freopen("p1.out", "w", stdout);
scanf("%d", &n);
rep(i, , n)    //从每一个结点出发,遍历方式都不同
{
memset(vis, , sizeof(vis));
solve(i, );
}
return ;
}

有重复元素的全排列

输入n(<=10)个小些字母(可能重复),按从小到大输出输出n 个字符的全部排列。
样例:
输入:
abaab
输出:
1:aaabb
2:aabab
3:aabba
4:abaab
5:ababa
6:abbaa
7:baaab
8:baaba
9:babaa
10:bbaaa

这道题跟全排列相比,元素可以重复。如果全排列方式建图的话,比如下图

会发现从1,3,4结点出发点的边,遍历的结果是一样的,从2和5出发也是一样。所以对于同一个字母,我们只希望从该点出发一次。

用vis数组标记共字母种类n,然后遍历n次

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i, a, n) for(int i = a; i <= n; ++i)
#define per(i, n, a) for(int i = n; i >= a; --i)
typedef long long ll;
int tot = , len;
char a[], ans[];
int vis[];
void print(int tot)
{
printf("%d:%s\n", tot, ans + );
}
void dfs(int x)
{
if(x == len + ) print(++tot);
rep(i, 'a', 'z')
{
if(vis[i]) //存在这个点
{
ans[x] = i;
vis[i]--; //表示这个点已经走过
dfs(x + );
vis[i]++;
}
}
}
int main()
{
// freopen("p3.in", "r", stdin);
// freopen("p3.out", "w", stdout);
scanf("%s", a);
len = strlen(a);
sort(a, a + len);
rep(i, , len - ) vis[a[i]]++;
dfs();
return ;
}

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

  1. for循环枚举法,全排列+dfs,补充浮点数注意事项

    其实这个题目我一直没想好应该叫什么,就是在做蓝桥杯的时候会遇到很多的题,给你一等式,abcdef...分别是1-9(||12||15)不重复问你有几种方案? 我之前一直都是用的for循环在做,听说这叫 ...

  2. 组合数学(全排列)+DFS CSU 1563 Lexicography

    题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...

  3. 数的全排列 dfs深度优先搜索

    数的全排列. 输入格式: 一个n(n<10),表示长度 输出格式: 按字典序输出长度为n的所有排列,每个排列后需要换行,每个排列数字以空格分开. 输入样例: 在这里给出一组输入.例如: 3 输出 ...

  4. uva 10344 23 out of 5 凑运算结果 全排列+dfs

    五个数三个运算符号,排列之后凑成结果为23,不考虑优先级. 很水,数据量也不大,先生成五个数的全排列,用dfs找出结果能否为23即可. 代码: #include <cstdio> #inc ...

  5. 全排列——DFS实现

    原创 之间就写过一篇全排列的博客:https://www.cnblogs.com/chiweiming/p/8727164.html 详细介绍请回看,用的方法(暂且就叫)是“交换法”,其实思路就是DF ...

  6. zzulioj--1730--通信基站(全排列+dfs)(好题)

    1730: 通信基站 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 28  Solved: 11 SubmitStatusWeb Board Desc ...

  7. 全排列dfs算法

    如下 #include <iostream> using namespace std; #define MAX 10 #define _CRT_SECURE_NO_WARNINGS int ...

  8. 蓝桥杯 剪邮票 全排列+DFS

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...

  9. wikioi 1294 全排列 dfs

    1294 全排列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold       题目描述 Description 给出一个n, 请输出n的所有全排列 输入描述 Inpu ...

  10. 输出1-n的全排列dfs

     https://ac.nowcoder.com/acm/contest/998/C #include<stdio.h> #include<iostream> #include ...

随机推荐

  1. [CF718C] Sasha and Array

    Description 给定一个数列,维护两种操作 操作 \(1\),将区间 \([l,r]\) 的数字统一加 \(x\). 操作 \(2\),求 \(\sum \limits_{i=l}^r f(v ...

  2. Linux进程间通信(System V) --- 消息队列

    消息队列 IPC 原理 消息队列是消息的链式队列,如下图为消息队列的模型.整个消息队列有两种类型的数据结构. 1.msqid_ds 消息队列数据结构:描述整个消息队列的属性,主要包括整个消息队列的权限 ...

  3. 【转载】To the Virgins, to Make Much of Time

    Gather ye rosebuds while ye may Old Time is still a-flying And this same flower that smiles today To ...

  4. (转)Visual Studio 2013新功能预览:增代码的透明度和可追溯性

    微软打破了Visual Studio两年升级一次的传统,Visual Studio 2012发布还不足一年,微软就计划发布了Visual Studio 2013了.在今天的TechEd大会上,微软宣布 ...

  5. 排版-标题及table

    排版-标题 在标题中还可以包含small标签,可以用来标记副标题 副标题灰色,比主标题小    <h1>我是标题 <small>我是小标题</small></ ...

  6. C# 循环语句 for

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变. for格式 for(初始条件;循环条件;状态改变) { 循环体 } break ——中断循环,跳出整个循环 continu ...

  7. 2017-12-26 Java关键字的汉化用词探讨

    @狗屎咖啡 的为GCC添加中文关键字项目对C关键词进行了汉化. 风格比较简约, 如'if'-如, 'else'-另. 个人感觉在中文编程语言尚未成熟之时, 不妨集思广益, 首先列出一些可选项, 然后从 ...

  8. Hbase简单配置与使用

    一. HBase的 二.基于Hadoop的HBase架构 HBase内置有zookeeper,但一般我们会有其他的Zookeeper集群来监管master和regionserver,Zookeeper ...

  9. Git应用—03分支管理和冲突解决(转载)

    Git 分支管理和冲突解决 https://www.cnblogs.com/mengdd/p/3585038.html 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. ...

  10. 自己搭建anki同步服务器

    最近帮孩子找学习的软件,发现了anki 不过同步速度太慢,但发现可以自己搭建同步服务器 具体方法见https://github.com/dsnopek/anki-sync-server 我的安装过程如 ...