数的全排列问题

//数的全排列问题
//输入整数n   字典序输出1-n的全排列
#include "iostream"
#include "cstdio"
#include "cstring"
using namespace std;
int visit[9];
int ans[9];
int n;
void dfs(int k)
{
    if(k==n)
    {
        for(int i=0;i<n;i++)
            printf("%d ",ans[i]);
        printf("\n");
        return ;
    }
    for(int i=0;i<n;i++)
    {
        if(visit[i])
            continue;
        ans[k]=i+1;
        visit[i]=1;
        dfs(k+1);
        visit[i]=0;
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        memset(visit,0,sizeof(visit));
        dfs(0);
    }
    return 0;
}
时间: 2024-10-19 06:23:17

数的全排列问题的相关文章

python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有1,2,3,4,5,6,7,8,9这一个数列,有9个数字,则有9!(9的阶乘)这么多种结果.那是非常大的.今天我就来介绍用深度优先搜索来解决这个数的全排列的问题. 深度优先搜索 首先简单介绍一下深度优先搜索,深度优先搜索的关键在于当下该如何做,至于下一步如何做,就与当下做的一样.深度优先搜索的基本模型为: dfs(step): 判断边界:执行相关操作,返回 尝试每一种可能 for( i

算法提高 排列数 (全排列)

问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排列中的第n个(第1个为0123456789). 输入格式 一行,包含一个整数n 输出格式 一行,包含一组10个数字的全排列 样例输入 1 样例输出 0123456789 数据规模和约定 0 < n <= 10! next_permutation方法 1 #include <iostream> 2 #include <cstdio&

十三:全排列-区间数排列

问题:全排列-区间数排列题目描述对n和m之间的数进行全排列(包括n和m,且:0<n<m<30),并且输出所有的排列结果输入两个整数,分别为n和m输出n和m之间所有数的全排列结果样例输入5 7样例输出5 6 75 7 66 5 76 7 57 5 6 7 6 5 1 #include<stdio.h> 2 #include<string.h> 3 int n,m; 4 void fun(int b[],int k){ 5 int i,j; 6 int t; 7 if

深搜--1-n的全排列

之前被教过一个next_permutation库函数,是用来实现数的全排列的,具体实现见代码 #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int main(){ int a[1000]; int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++) a[i]=i+1; do{

全排列算法(转)

列出全排列的初始思想: 解决一个算法问题,我比较习惯于从基本的想法做起,我们先回顾一下我们自己是如何写一组数的全排列的:1,3,5,9(为了方便,下面我都用数进行全排列而不是字符). 1,3,5,9.(第一个) 首先保持第一个不变,对3,5,9进行全排列. 同样地,我们先保持3不变,对5,9进行全排列. 保持5不变,对9对进行全排列,由于9只有一个,它的排列只有一种:9.接下来5不能以5打头了,5,9相互交换,得到 1,3,9,5. 此时5,9的情况都写完了,不能以3打头了,得到 1,5,3,9

【codeup】1959: 全排列 及全排列算法详解

题目描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列.我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列. 输入 输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间. 输出 输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前面.字母序如下定义:已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存

多校7 HDU5816 Hearthstone 状压DP+全排列

1 多校7 HDU5816 Hearthstone 状压DP+全排列 2 题意:boss的PH为p,n张A牌,m张B牌.抽取一张牌,能胜利的概率是多少? 3 如果抽到的是A牌,当剩余牌的数目不少于2张,再从剩余牌里抽两张,否则全部拿完. 4 每次拿到一张B牌,对boss伤害B[i]的值 5 思路:dp[i]表示状态为i时的方案数 6 先处理出所有状态下的方案,再枚举每种状态,如果符合ans+=dp[i]*剩余数的全排列 7 当前集合里有a张A,b张B,那么还能取的牌数:a*2-a-b+1 8 9

全排列的非递归算法

1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素的所有排列的个数,称为排列数.从n个元素取出n个元素的一个排列,称为一个全排列.全排列的排列数公式为n!,通过乘法原理可以得到. 2.时间复杂度: n个数(字符.对象)的全排列一共有n!种,所以全排列算法至少时间O(n!)的.如果要对全排列进行输出,那么输出的时间要O(n?n!),因为每一个排列都有n个数

数字全排列

数字全排列 问题描述 给一个不重复的数字数组,写一个程序,输出全排列. 比如给定数组: [1, 2, 3] 输出: [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1] 解决思路 这个问题很经典,接下来尝试使用数学归纳法的思想来解决这个问题. 在中学的时候,我们就知道一个长度为n的数列有n!个排列.因为第一个数字有n种情况,第二个数字有n-1种情况,第三个数字有n-2种情况--第n个数字只有一种情况了,用公式表示就是n*(n-1)