算法题每日一练---第21天:全排列

简介: 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列(1≤n≤9),要求所产生的任一数字序列中不允许出现重复的数字。

一、问题描述


按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列(1≤n≤9),要求所产生的任一数字序列中不允许出现重复的数字。

例如3的全排列为

1    2    3
1    3    2
2    1    3
2    3    1
3    1    2
3    2    1


二、题目要求


考察

深度搜索,全排列公式
建议用时15~25min



三、问题分析


1.公式法

看到问题,很自然就会想到C++里面的全排列公式,一步解决。 头文件algorithm,a代表数组名称,n代表数组大小

do{
}while(next_permutation(a,a+n));


2.DFS

第二种方法,深度搜索(DFS),对于一些大题来说应用广泛,这一题虽然直接使用全排列公式更加合适,今天还是了解一下DFS这种用法。

3.png


DFS简单来说就是一只老鼠走迷宫,遇到走不通的道路,往回退一个(俗称回溯)。


4.png

与之相对的广度搜索(BFS)更像是,多只老鼠走迷宫,从一个点分别向多个方向发散,直到找到出口。

以全排列为例,设置一个访问数组visited[10],判断当前数字是否被访问过,0代表没有,1代表有。从1开始深度搜索,未被访问过的数字存入数组,置为1,对下一个数字深度搜索,直到大于给定的n,输出数组里面的数字,进行回溯,以此类推


四、编码实现


1.公式法

#include<iostream>#include<algorithm>//头文件usingnamespacestd;
intmain()
{
inti,n,a[9];//初始化cin>>n;//输入nfor(i=0;i<n;i++)
a[i]=i+1;//初始化数组do    {
for(i=0;i<n;i++)//循环        {
printf("%5d",a[i]);//输出数组元素        }
cout<<"\n";
    }while(next_permutation(a,a+n));//全排列公式return0;
}


2.DFS

#include<iostream>usingnamespacestd;
intn,a[10],visited[10]={0};//初始化定义数字数组和访问数组voidDFS(intk)
{
inti,j;
if(k>n)//大于n    {
for(j=1;j<=n;j++)//输出数组里面的元素        {
printf("%5d",a[j]);
        }
cout<<"\n";
    }
else    {
for(i=1;i<=n;i++)//循环判断        {
if(!visited[i])//是否访问过            {
visited[i]=1;//置为1a[k]=i;//赋值当前i给到kDFS(k+1);//下一步visited[i]=0;//回溯            }
        }
    }
}
intmain()
{
cin>>n;//输入nDFS(1);//从1开始深搜return0;
}


五、输出结果


输入3

6.png



相关文章
|
6月前
|
算法 C++ 索引
【算法】——全排列算法讲解
【算法】——全排列算法讲解
195 0
|
6月前
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
87 0
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
66 0
|
5月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
5月前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
|
6月前
|
算法 Java
算法-----全排列
算法-----全排列
|
算法
代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II
代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II
60 0
|
机器学习/深度学习 存储 算法
算法训练Day29|* 491.递增子序列* 46.全排列* 47.全排列 II
算法训练Day29|* 491.递增子序列* 46.全排列* 47.全排列 II
|
自然语言处理 算法
经典算法之——解决全排列问题以及详解
经典算法之——解决全排列问题以及详解
242 0