51nod 1384 全排列

潘多拉之门

首先一发DFS,注意字母重复。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int l;
int vis[15],a[15],b[15];
char s[15];
void dfs(int d)
{
    int i;
    if(d==l)
    {
        for(i=0;i<l;i++)
        {
            cout<<b[i];
        }
        cout<<endl;
        return;
    }
    else
    {
        for(i=0;i<l;i++)
        {
            if(!vis[i])
            {
                vis[i]=1;
                b[d]=a[i];
                dfs(d+1);
                vis[i]=0;
                while(i-1<l&&a[i]==a[i+1]) i++;
            }
        }
    }
}
main()
{
    scanf("%s",s);
    l=strlen(s);
    for(int i=0;i<l;i++)
    a[i]=s[i]-‘0‘;
    sort(a,a+l);
    memset(vis,0,sizeof(vis));
    dfs(0);
}

一发STL   next_permutation

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
main()
{
    char s[15];
    int len;
    scanf("%s",s);
    len=strlen(s);
    sort(s,s+len);
    do{
        puts(s);
    }while(next_permutation(s,s+len));
} 
时间: 2024-10-12 15:04:21

51nod 1384 全排列的相关文章

51nod 1384 可重集的全排列

对于1231,121,111等有重复的数据,我们怎么做到生成全排列呢 实际上,对于打标记再释放标记的这种方法,如果一开始第一层递归访问过1那么你再访问 就会完全重复上一次1开头的情况,那么递归地考虑这件事,我们发现不需要重复相同的开头 但这样可能会重复一个数字过多次数,比如121,第一层2,第二层可能是2,第三层可能也是2 那么我们怎么解决这个呢,一个笨办法是统计原数组该值出现几次,现有生成的数列里出现了几次, 那么比较一下大小,我们就知道能不能放 关于不放重复开头这件事,我们可以对原序列排序,

1384 全排列

题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1384 给出一个字符串S(可能又重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列.例如:S = "1312", 输出为: 1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211 Input 输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字) Ou

生成n个元素的全排列 C实现

近期在准备复习算法设计的考试,下边记录一些,看笔记时突然想到的解法. 问题是这种 用递归实现 n 个元素的全排列. 当时老师给出的解答是 假定第i个元素 ri 放在首位,于是 f(r1,r2,-,rn) = f(ri U {r1, r2,-.,rn}) = U (ri & f(r1,r2, -, rn)), 当时应该是听懂了,只是如今看到这个笔记.又醉了. (这货竟然是我上课记的笔记 .... . .. .) 后来自己细致想想,事实上非常简单的 一个问题, 利用回溯法,把问题看成是一个排列树.能

51nod 1201 整数划分(dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题解:显然是一道dp,不妨设dp[i][j]表示数字i分成j个一共有几种分法. 那么转移方程式为: dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] 表示将i - 1划分为j个数,然后j个数都+1 还是不重复,将i - 1划分为j - 1个数,然后j - 1个数都+1,再加上1这个数. 然后就是j的范围要知道1+2+

递归实现全排列(一)

[思路] 下面用具体例子来阐述这种实现的思路,例如实现123的全排列组合. 要求123的全排列,可以分为以下情况: 情况1:第0位为1+23的全排列 情况2:第0位为2+13的全排列 情况3:第0位为3+32的全排列 上面的情况用代码实现如下: //情况1 //为了跟下面一致,加上swap(list[0],list[0]); perm(list,1,2); //为了跟下面一致,加上swap(list[0],list[0]); //情况2 swap(list[0],list[1]); perm(l

全排列算法-Java

第一步,排列的精髓是交换和顺序处理,比如,考虑[1,2,3,4]排列,实际上是,1和1,2,3,4分别交换得来 1和1交换:[1],[2,3,4] 1和2交换:[2],[1,3,4] 1和3交换:[3],[2,1,4] 1和4交换:[4],[2,3,1] 那么下面分别考虑上面的四个结果,比如,考虑 [1],[2,3,4] 第二步,我们把[1]固定不变,考虑[2,3,4],把它看成是2和2,3,4分别交换,得到如下结果: [1]固定,2和2交换:[1],[2],[3,4] [1]固定,2和3交换:

51nod 1138 连续整数的和(数学)

题目描述: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2).例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8.如果不能写为若干个连续整数的和,则输出No Solution. Input 输入1个数N(3 <= N <= 10^9). OutPut 输出连续整数中的第1个数,如果有多

求数字或者字符串的全排列

以数字举例:有一个数组A的数为 :1 2 3 4 ,其按字典序列的全排列为: 1 2 3 4 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2 2 1 3 4 2 1 4 3 2 3 4 1 ---. 总共有 n!个排列,现在输入一个数K,输出其第K的排列 方法:采用康托编码的思想,其实就是求出每个位置上的数字:第一个位置的数字,第二个位置的数字.... 解法:按顺序求出每个位置上的数,这边假设 K=8 :数组为:1 2 3 4 ,长度为4,位置p代表数组中第P个数:p=k/ (n

递归算法:求序列的全排列

用C++模板书写一段序列数组的全部排列 /** * 书本:[windows程序设计] * 功能:输出全部的排列情况 * 文件:全排列.cpp * 时间:2014年9月29日21:52:55 * 作者:cutter_point */ #include <iostream> using namespace std; //交换两个元素的函数 template<class Type> inline void Swap(Type &a, Type &b) //取两个元素的引用