关于回溯与n个数的全排列

  今天要讲的题目是全排列的问题:有1、2、3、...、n这样一个数列,要求输出其全排列。

  那么,显然,这道题目非常之简单,用一个标志数组变量,标记数字的使用情况,然后根据它挑选数字即可。由于题目很简单,在这就不多说了,来看看代码:

 1 #include<stdio.h>
 2 int n;
 3 int sum=0;//统计方法数
 4 int a[10001]={0};//用于储存答案
 5 int flag[10001]={0};//所有数字的标志变量初始化为0
 6 void out();//函数用于输出
 7 void f(int k);//函数用于求解
 8 int main()
 9 {
10     scanf("%d",&n);
11     f(0);
12     return 0;
13 }
14 void f(int k)
15 {
16     int i;
17     for(i=1;i<=n;i++)
18     {
19         if(flag[i]==0)//如果i没有被使用过
20         {
21             a[k]=i;//则选中i
22             flag[i]=1;//标记i为已使用
23             if(k==(n-1))//如果找到了所有n位数
24                 out();//输出
25             else
26                 f(k+1);//否则继续寻找下一位
27             flag[i]=0;//返回时还原现场
28             a[k]=0;
29         }
30     }
31 }
32 void out()
33 {
34     int i;
35     sum++;//每执行一次该函数则说明有一个解
36     printf("%d:\n",sum);
37     for(i=0;i<n;i++)
38         printf("%d ",a[i]);
39     printf("\n");
40 }

  代码如有不足,欢迎指教!

时间: 2024-07-28 22:00:47

关于回溯与n个数的全排列的相关文章

n个数的全排列的相关问题

问题类型:需要进行n个数的全排列再进行其他操作O(2^n) c++代码实现: #include<iostream> using namespace std; int perm[11],pos,n; bool mapp[11]={0}; void perm1(int pos,int n) { if(pos==n+1) { for(int k=1;k<=n;k++) printf("%2d ",perm[k]); putchar('\n'); <span style

LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会详细解读深度优先搜索和回溯算法,感兴趣的同学不容错过. 链接 Next Permutation 难度 Medium 描述 实现C++当中经典的库函数next permutation,即下一个排列.如果把数组当中的元素看成字典序的话,那下一个排列即是字典序比当前增加1的排列.如果已经是字典序最大的情况

回溯,字符串处理,全排列

R={r1,r2,r3,...,rn};Perm(R)表示R的全排列 全排列问题,R的全排列递归定义如下: 1.当n=1时, Perm(R)={r}; 2.当n>1时, Perm(R)=(r1)Perm(r1),(r2)Perm(r2),...,(rn)Perm(rn); #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <iostream> #define MAX

N个数的全排列 -------指定排头法

输入 一个整数N  再输入N个整数 输出 N个数的全排 代码如下: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 100 4 5 int a[2][N] = {0}; 6 int p[N] = {0}; 7 8 void dfs(int k, int n) 9 { 10 int i; 11 12 if(k == n) 13 { 14 for(i = 0; i < n - 1; i++) 15 printf("

回溯算法 和 贪心算法(全排列)

一:简介 (1)回溯法 又称试探法 回溯法的基本做法是深度优先搜索,是一种组织得井井有条的.能避免不必要重复搜索的穷举式搜索算法:基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 适用场景:当遇到某一类问题时,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题.回溯法的优点在于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率.但是,对于可以得出明显的递推公式迭代求解的问题,还是不要用回溯法,因为它花费的时间

LeetCode46 回溯算法求全排列,这次是真全排列

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode的26篇文章,我们来实战一下全排列问题. 在之前的文章当中,我们讲过八皇后.回溯法,也提到了全排列,但是毕竟没有真正写过.今天的LeetCode46题正是让我们生成给定元素的全排列. 题意很简单,只有一句话,给定一个没有重复元素的序列,让我们返回这个序列所有的全排列,并且我们不需要考虑这些排列的顺序. 回溯法 我们在之前的文章当中分析过,全排列问题,可以看成是搜索问题,从而近似成八皇后问题.在八皇后问题当中,我们枚

UVA110- Meta-Loopless Sorts(模拟全排列)

题目链接 题意:给你n个数,要求按照题目所给的规则大小排序,输出所有可能的结果. 思路:其实求出来的所有序列是n个数的全排列,那么难点在于怎么按照题目所给的格式输出.我们可以看出其实是在已知的序列上插空,所以就可以使用回溯来插入元素,这里可以使用vector,方便元素的插入. #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algo

回溯法第1题—数字排列问题

[问题描述] 列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入:n(1<=n<=9) 输出:由1~n组成的所有不重复的数字序列,每行一个序列. [样例输入] 3 [样例输出] 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 [问题分析] 这题要求输出n个数的全排列(从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列). 显然也没有什

全排列问题的递归算法(Perm)

[题目]设计一个递归算法生成n个元素{r1,r2,-,rn}的全排列. [算法讲解] 设R={r1,r2,-,rn}是要进行排列的n个元素,Ri=R-{ri}.集合X中元素的全排列记为perm(X).(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列.R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素:当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),-,(rn)perm(Rn)构成.实现思想:将