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 ...
随机推荐
- querylist 在laravel框架中的简单采集数据(专业5)
//爬虫网站路由Route::get('/querylist/list','querylistControllers@querylist'); //控制器 <?phpnamespace App\ ...
- 微信小程序 地区选择器 和省市县三级联动 和button按钮分享
wxml代码: <view class="section__title"> 地区选择器 </view> <picker bindchange=&quo ...
- 【ASP.NET Core】MVC 控制器的模型绑定(宏观篇)
欢迎来到老周的水文演播中心. 咱们都知道,MVC的控制器也可以用来实现 Web API 的(它们原本就是一个玩意儿),区别嘛也就是一个有 View 而另一个没有 View.于是,在依赖注入的服务容器中 ...
- 1.1 STL基本概念
文章目录 1 STL概述 1.1 STL基本概念 1.2 STL 六大组件 1.3 STL优点 2.1 容器 2.2 算法 2.3 迭代器 2.4 示例 1 STL概述 STL是StandardTem ...
- vue3-插槽作用域的使用
当我们在父组件定义了一个数组, data() { return { name: ["lkx", "msx"] } } 想把它传到子组件处理后 props: { ...
- ArcGIS进行视域分析及地形图制作
问题说明 开发商要在本区域建造观景亭,希望在观景亭上能看到优美的景色.根据提供的数据,完成以下要求. 一. 数据说明(见"题目3"文件夹) 1. DEM.tif:研究区域的数据高 ...
- 使用http-server 模拟接口数据 mock data
首先创建文件夹 mkdir mockData&&cd mockData 安装http-server npm i http-server 创建数据文件 touch index.json ...
- Cobalt Strike之LINK木马
在同一目录下 新建一个exp.ps1 一个test.txt exp.ps1代码 $file = Get-Content "test.txt" $WshShell = New-Obj ...
- systemd --user进程CPU占用高问题分析
1.问题由来 近期发现堡垒机环境有如下问题,systemd占用大量cpu: 原文链接:https://www.cnblogs.com/yaohong/p/16046670.html 2.问题定位 2. ...
- CRI容器运行时
CRI容器运行时 我们知道 Kubernetes 提供了一个 CRI 的容器运行时接口,那么这个 CRI 到底是什么呢?这个其实也和 Docker 的发展密切相关的. 在 Kubernetes 早期的 ...