zoukankan      html  css  js  c++  java
  • 【模板】 全排列 && 有重复元素的全排列

    全排列

    #include<bits/stdc++.h>
    using namespace std;
    int pl[1001]; 
    void print (int n){
        for(int i=1;i<=n;i++) cout<<"    "<<pl[i];
        cout<<endl;
    }
    void pp(int n,int pos=1){
        if(pos==n+1) {
                print(n);
                return ;
                }
        for(int i=1;i<=n;i++){
            bool ok=1;
            for(int j=1;j<pos;j++){
                if(pl[j]==i) ok=0;
            }
            if(ok) {
                pl[pos]=i;        
                pp(n,pos+1);
            }
        }
    }
    int main(){
        int n;
        cin>>n;
        pp(n);
        return 0;
    }

    有重复元素的全排列//然而并不能过所有测试点

    #include<bits/stdc++.h>
    using namespace std;
    char pl[1001];
    int cnt;
    void print(int n){
        for(int i=0;i<n;i++)
        cout<<pl[i];
        cnt++;
        cout<<endl;
    } 
    void pp(char p[],int n,int pos=0){
        if(pos==n){
            print (n);
            return ;
        }
        for(int i=0;i<n;i++){
            if(i==0||p[i]!=p[i-1]){
                int c1=0,c2=0;
                c1=count (pl,pl+pos,p[i]);
                c2=count (p,p+n,p[i]);
                if(c1<c2){
                    pl[pos]=p[i];
                    pp(p,n,pos+1);
                }
            }
        }
    }
    int main(){
        int n;
        char ddd[2000];
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>ddd[i];
        }
        pp(ddd,n);
        cout<<cnt;
        return 0;
    }

    所以我用STL模板

    STL大法好

    这里是char类型的

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        long long cnt=0;
        ios::sync_with_stdio(false);
        char dd[5000];
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>dd[i];
        sort (dd,dd+n);
        do{
            for(int i=0;i<n;i++){
            printf("%c",dd[i]);
            }
            cnt++;
            printf("
    ");
        }while(next_permutation(dd,dd+n));
        printf("%d",cnt);
        return 0;
    }
  • 相关阅读:
    git基本使用
    list和tuple
    牛客(60)把二叉树打印成多行
    牛客(59)按之字形顺序打印二叉树
    牛客(58)对称的二叉树
    牛客(57)二叉树的下一个结点
    牛客(56)删除链表中重复的结点
    牛客(55)链表中环的入口结点
    mybits(1)配置
    牛客(53)表示数值的字符串
  • 原文地址:https://www.cnblogs.com/luv-letters/p/8479881.html
Copyright © 2011-2022 走看看