全排列(dfs)
无重复元素的全排列
输入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)的更多相关文章
- for循环枚举法,全排列+dfs,补充浮点数注意事项
其实这个题目我一直没想好应该叫什么,就是在做蓝桥杯的时候会遇到很多的题,给你一等式,abcdef...分别是1-9(||12||15)不重复问你有几种方案? 我之前一直都是用的for循环在做,听说这叫 ...
- 组合数学(全排列)+DFS CSU 1563 Lexicography
题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...
- 数的全排列 dfs深度优先搜索
数的全排列. 输入格式: 一个n(n<10),表示长度 输出格式: 按字典序输出长度为n的所有排列,每个排列后需要换行,每个排列数字以空格分开. 输入样例: 在这里给出一组输入.例如: 3 输出 ...
- uva 10344 23 out of 5 凑运算结果 全排列+dfs
五个数三个运算符号,排列之后凑成结果为23,不考虑优先级. 很水,数据量也不大,先生成五个数的全排列,用dfs找出结果能否为23即可. 代码: #include <cstdio> #inc ...
- 全排列——DFS实现
原创 之间就写过一篇全排列的博客:https://www.cnblogs.com/chiweiming/p/8727164.html 详细介绍请回看,用的方法(暂且就叫)是“交换法”,其实思路就是DF ...
- zzulioj--1730--通信基站(全排列+dfs)(好题)
1730: 通信基站 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 28 Solved: 11 SubmitStatusWeb Board Desc ...
- 全排列dfs算法
如下 #include <iostream> using namespace std; #define MAX 10 #define _CRT_SECURE_NO_WARNINGS int ...
- 蓝桥杯 剪邮票 全排列+DFS
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
- wikioi 1294 全排列 dfs
1294 全排列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个n, 请输出n的所有全排列 输入描述 Inpu ...
- 输出1-n的全排列dfs
https://ac.nowcoder.com/acm/contest/998/C #include<stdio.h> #include<iostream> #include ...
随机推荐
- dom操作------获取长/宽/距离等值的若干方法
1.offsetLeft:获取元素边框以外至文档顶的距离:若其祖先元素有定位属性position则返回值为元素到该定位元素的距离,不包括祖先元素的三宽(padding,border,margin),且 ...
- 通过webservice(System.Data.OracleClient)调试oracle
环境:vs2008+webservice+net framework3.5+oracle10g 原因:在项目中运行web程序,默认是使用vs内置web服务器(develop server),而这个内置 ...
- Cordova - 彻底搞定IOS编译!
操作系统:OSX10.14 XCode:10.1 Cordova:8.1.2 假设已经配置好了Cordova开发环境,Apple ID你也有,XCode也可以正常工作了,那么就可以继续看这篇文章了! ...
- Matlab Euler's method
% matlab script to test efficiency of % Euler's method, classical Runge-Kutta, and ode45 % on Arenst ...
- webpack4 系列教程(九): CSS Tree Shaking
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步原文地址 有空就来看看个人技术小站, 我一直都在 0. 课程介绍和资料 本次课程的代码目录(如下图所示): >>> ...
- linux shell脚本之-变量极速入门与进阶(2)
1,$$:显示当前的进程id号 ghostwu@dev:~/linux/shell/how_to_use_var$ cat show_pid.sh #!/bin/bash echo $$ ghostw ...
- canvas-0trasform.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python 练习:使用 # 号输出长方形
使用 # 号输出一个长方形,用户可以指定宽和高 height = int(input("please input height: "))width = int(input(&quo ...
- cdn原理的理解
今天要做个小笔记,浅谈一下对cdn的一些理解,在工作中我们经常用到cdn代理访问,那他的原理是什么不知道大家有没有考虑过 CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集 ...
- [VUE ERROR] Error in render: "TypeError: Cannot create property 'header' on boolean 'true'"
项目基于ElemnetUi进行的开发,在引入第三方扩展库 vue-element-extends 之后使用它的表格组件报了这个错 解决方案: 1. 删除项目中的 node_modules 2. 删除 ...