caioj 1031: [视频]递归1(全排列)【DFS】【全排列】
题目大意:先给一个正整数 n( 1 < = n < = 10 ),输出1到n的所有全排列。
题解:这道题目我们可以用递归来实现,递归在图论中又称为“深度优先搜索”(Depth First Search,DFS),所以在平时我们经常把用到递归的算法简称为DFS。
我们假设a[i]表示当前排列第i个数的值,用vis表示在当前递归的时候数值i有没有出现在之前的排列数中,则我们可以用下面的dfs(int index)来实现找出全排列的算法。
其中,index表示当前判断到第index个排列数(即编号从0到i-1这前i个排列中的数已经找好了,现在在找第i个排列数)。
代码如下:
#include <cstdio>
#include <cstring>
int n, a[11];
bool vis[11];
void output()
{
printf("%d", a[0]);
for (int i = 1; i < n; i ++)
printf(" %d", a[i]);
printf("\n");
}
void dfs(int idx)
{
if (idx == n)
{
output();
return;
}
for (int i = 1; i <= n; i ++)
{
if (!vis[i])
{
vis[i] = true;
a[idx] = i;
dfs(idx+1);
vis[i] = false;
}
}
}
int main()
{
while (~scanf("%d", &n))
{
memset(vis, false, sizeof(vis));
dfs(0);
}
return 0;
}
除此之外,C++的STL中的algorithm库中为我们提供了next_permutation函数,它用于根据当前的排列推测出接下来的那个排列。
我们现在可能还没有接触到排列组合的问题,但是学过排列组合问题以后我们将会知道1到n这n个数能够组成的排列的个数是n!(=n(n-1)……*1)
所以我们可以开一个for循环,循环体内调用next_permutation,知道找到n!个排列,代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
int n, a[11];
void output()
{
printf("%d", a[0]);
for (int i = 1; i < n; i ++)
printf(" %d", a[i]);
printf("\n");
}
int main()
{
while (~scanf("%d", &n))
{
int tot = 1;
for (int i = 2; i <= n; i ++)
tot *= i;
for (int i = 0; i < n; i ++)
a[i] = i + 1;
output();
for (int i = 1; i < tot; i ++)
{
next_permutation(a, a+n);
output();
}
}
return 0;
}
caioj 1031: [视频]递归1(全排列)【DFS】【全排列】的更多相关文章
- for循环枚举法,全排列+dfs,补充浮点数注意事项
其实这个题目我一直没想好应该叫什么,就是在做蓝桥杯的时候会遇到很多的题,给你一等式,abcdef...分别是1-9(||12||15)不重复问你有几种方案? 我之前一直都是用的for循环在做,听说这叫 ...
- 数的全排列 dfs深度优先搜索
数的全排列. 输入格式: 一个n(n<10),表示长度 输出格式: 按字典序输出长度为n的所有排列,每个排列后需要换行,每个排列数字以空格分开. 输入样例: 在这里给出一组输入.例如: 3 输出 ...
- dfs 全排列 使用交换——含重复元素和非重复元素
15. 全排列 中文 English 给定一个数字列表,返回其所有可能的排列. 样例 样例 1: 输入:[1] 输出: [ [1] ] 样例 2: 输入:[1,2,3] 输出: [ [1,2,3], ...
- 组合数学(全排列)+DFS CSU 1563 Lexicography
题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...
- 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 ...
- 递归实现1-n的全排列(JAVA语言)
思路: For example: 123的全排列= 1在最前面 23的全排列 + 2在最前面 13的全排列 + 3最前面 12的全排列 所以只需交换和最前面元素的位置,生成剩余元素的全排列即可. im ...
- 全排列dfs算法
如下 #include <iostream> using namespace std; #define MAX 10 #define _CRT_SECURE_NO_WARNINGS int ...
随机推荐
- 微信小程序授权登录将open_id传至后台并入库
要求能把用户昵称.头像以及open_id写入数据库,服务端保持用户登录状态 wxml: <block wx:else> <button type="primary" ...
- PhpStorm 编辑器上更改文件后自动上传服务器
在编辑器内设置自动上传后很方便,,,就不用编辑完了之后还要去服务器里面上传,很麻烦!!!设置了自动上传Ctrl +S 就可以上传了 方便至极~~~~~~~希望可以帮到大家 1.菜单栏找到[工具/To ...
- 一比一还原axios源码(二)—— 请求响应处理
上一章,我们开发了一些简单的代码,这部分代码最最核心的一个方法就是buildURL,应对了把对象处理成query参数的方方面面.虽然我们现在可以发起简单的请求了,但是第一,我们无法接收到服务器的响应, ...
- AT1219题解
题意 设 \(a\) 的价值为 \(a \times cnt_a\)(\(cnt_a\) 为 \(a\) 在区间中出现的次数),求区间种某种元素,使得这种元素的价值最大. 因为设计出现元素的次数,所以 ...
- git使用命令行保留原分支迁移代码仓库
有些时候我们需要对git仓库中的项目进行一些迁移,如从a账号迁移到b账号下,从github平台迁移到内部的gitlab平台等.一般平台会自带 migrate 或者 import 的功能,可以很方便的进 ...
- 机器学习之BP神经网络
import random import math #神经元的定义 class Neuron: def __init__(self,bias): self.bias = bias self.weigh ...
- 【dubbo3.x trace组件分享】
目录 背景 一.trace-dubbo组件介绍 二.设计原理 2.1 原理图 2.2 实现方案 2.2.1 consumer端实现 2.2.2 provider端实现 2.2.3 traceId和sp ...
- CTF--Do you like xml
题目链接:http://47.94.221.39:8008/ 扫描目录得到/.DS_Store文件 下载文件,直接用脚本进行还原操作. https://github.com/lijiejie/ds_s ...
- Flask(Jinja2) 服务端模板注入漏洞
原理 参考文章: https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-R ...
- Mysql查询优化器之基本优化
对于一个SQL语句,查询优化器先看是不是能转换成JOIN,再将JOIN进行优化 优化分为: 1. 条件优化 2.计算全表扫描成本 3. 找出所有能用到的索引 4. 针对每个索引计算不同的访问方式的成本 ...