模拟题_Loli的排列组合

Loli说得分前八六个的都是清华北大了,23333333333
1、 pl.cpp输入一行字母(长度小于等于10),输出:第一行输出全排列个数,从下一行开始按字典序输出这些字母所有可能的排列,每行一个。(数据保证无重复字母)

2、 zh.cpp第一行输入一个字符串,(长度小于等于15)第二行输入一个数字m,输出:第一行输出从这个字符串里面选出m个的组合数,从下一行开始按字典序输出可能的组合(每个组合也要把字母按字典序排好,每行一个。)(数据保证无重复字母)

3、 np.cpp输入一行字母(长度小于等于26),输出它所有的全排列里面,按字典序排在它后面的那个。(数据保证无重复字母)

4、 xh.cpp第一行输入一个字符串,第二行输入一个数字m,输出这些字母的全排列里面按字典序排名m的序列。(数据保证无重复字母)

5、 bh.cpp输入一行字母输出它在这些字母的全排列里面按字典序的序号。(数据保证无重复字母)

6、 plt.cpp输入一行字母(长度小于等于9,可能有重复字母),输出:第一行输出全排列个数,从下一行开始按字典序输出这些字母所有可能的排列,每行一个。

7、 zht.cpp第一行输入一个字符串(长度小于等于15可能有重复字母),第二行输入一个数字m,输出:第一行输出从这个字符串里面选出m个的组合数,从下一行开始按字典序输出可能的组合(每个组合也要把字母按字典序排好,每行一个。)

T1 DFS putchar()输出

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
char a[16],s[16];int l,m;bool b[16];
inline void print(){for(int i=0;i<m;i++) putchar(s[i]);printf("\n");}
inline int pl(int fr,int to){int x=1;for(int i=fr;i<=to;i++) x*=i;return x;}
inline void dfs(int now,int k){
    if(now==m){print();return;}
    for(int i=k;i<l;i++){
        if(!b[i]){s[now]=a[i];b[i]=true;dfs(now+1,i+1);b[i]=false;s[now]='\0';}
    }
}
int main(){
    freopen("zh.in","r",stdin);freopen("zh.out","w",stdout);
    gets(a);l=strlen(a);scanf("%d",&m);int ans=pl(m+1,l)/pl(1,l-m);
    printf("%d\n",ans);sort(a,a+l);
    dfs(0,0);fclose(stdin);fclose(stdout);return 0;
}

T2 改改T1代码 DFS到m即可

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char a[11];char s[11];bool b[11];int l;int jc[11]={0,1,2,6,24,120,720,5040,40320,362880,3628800};
inline void print(){for(int i=0;i<l;i++) putchar(s[i]);putchar('\n');}
inline void dfs(int now){
    if(now==l){print();return;}
    for(int i=0;i<l;i++){
        if(!b[i]){s[now]=a[i];b[i]=true;dfs(now+1);b[i]=false;}
    }
}
int main(){
    freopen("pl.in","r",stdin);freopen("pl.out","w",stdout);
    gets(a);l=strlen(a);printf("%d\n",jc[l]);
    sort(a,a+l);
    dfs(0);fclose(stdin);fclose(stdout);return 0;
}

T3 模拟回溯过程

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
char a[27],s[27];int l;bool b[27];bool flag;
inline int find(char c){
    for(int i=0;i<l;i++) if(a[i]==c) return i;
}
inline bool behind(char c){
    for(int i=find(c)+1;i<l;i++) if(!b[i]) return 1;
    return 0;
}
inline void print(){for(int i=0;i<l;i++) putchar(s[i]);putchar('\n');}
inline void hs(int now){
    if(flag) return;
    if(behind(s[now])){
        flag=true;b[find(s[now])]=false;
        for(int i=find(s[now])+1;i<l;i++) if(!b[i]) {s[now]=a[i];b[i]=true;break;}
        for(int i=0;i<l;i++) if(!b[i]) s[++now]=a[i];
        print();
    }
    else{b[find(s[now])]=false;hs(now-1);}
}
int main(){
    freopen("np.in","r",stdin);freopen("np.out","w",stdout);
    gets(s);l=strlen(s);strcpy(a,s);sort(a,a+l);
    memset(b,1,sizeof(b));hs(l-1);
    fclose(stdin);fclose(stdout);return 0;
}

T4 查找第vi位置单词

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char a[100001];char s[100001];bool b[10001];long long l,m,t;
inline void print(){for(int i=0;i<l;i++) putchar(s[i]);putchar('\n');}
inline long long pl(int to){long long x=1;for(int i=1;i<=to;i++) x*=i;return x;}
inline int find1(int t){
    int v=0;
    for(int i=0;i<l;i++){
        if(!b[i]) v++;
        if(v==t) return i;
    }
}
inline int find2(char c){
    for(int i=0;i<l;i++){
        if(a[i]==c) return i;
    }
}
int main(){
    freopen("xh.in","r",stdin);freopen("xh.out","w",stdout);
    gets(a);l=strlen(a);cin>>m;
    sort(a,a+l);m--;int i;
    for(i=0;i<l;i++){
        t=m/pl(l-i-1);
        s[i]=a[find1(t+1)];
        b[find2(s[i])]=true;
        m%=pl(l-i-1);
    }
    print();
    fclose(stdin);fclose(stdout);return 0;
}

T5 查找位置权值

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char a[100005],s[100005];int l;long long ans;
bool b[100005];
inline long long pl(int to){long long x=1;for(int i=1;i<=to;i++) x*=i;return x;}
inline int find1(char c){
    int v=0;
    for(int i=0;i<l;i++){
        if(a[i]==c) return v;
        if(!b[i]) v++;
    }
}
inline int find2(char c){
    for(int i=0;i<l;i++){
        if(a[i]==c) return i;
    }
}
int main(){
    freopen("bh.in","r",stdin);freopen("bh.out","w",stdout);
    gets(s);l=strlen(s);strcpy(a,s);sort(a,a+l);
    for(int i=0;i<l;i++){
        ans+=find1(s[i])*pl(l-i-1);b[find2(s[i])]=true;
    }
    cout<<ans+1;
    fclose(stdin);fclose(stdout);return 0;
}

T6 统计重复字母排列组合 加字母判重
ans=n!/(n1!*n2!*n3!…nn!);
n1+n2+n3+…+nn=n;//每个字母重复次数

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char a[11];char s[11];bool b[11];int l,t,tt,ans=1;int jc[11]={1,1,2,6,24,120,720,5040,40320,362880,3628800};
bool use[11][260];bool cf[11];
inline void print(){for(int i=0;i<l;i++) putchar(s[i]);putchar('\n');}
inline void dfs(int now){
    if(now==l){print();return;}
    for(int i=0;i<l;i++){
        if(!(b[i])&&(!use[now][a[i]])){use[now][a[i]]=true;s[now]=a[i];b[i]=true;dfs(now+1);b[i]=false;s[now]='\0';}
    }
    memset(use[now],0,sizeof(use[now]));
}
int main(){
    freopen("plt.in","r",stdin);freopen("plt.out","w",stdout);
    gets(a);l=strlen(a);sort(a,a+l);
    int k=0,m=0;
    while(k<l){
        while(a[k]==a[k+1]) m++,k++;
        m++,k++;
        ans*=jc[m];m=0;
    }
    printf("%d\n",jc[l]/ans);
    dfs(0);fclose(stdin);fclose(stdout);return 0;
}

T7 其实懒得敲

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
char a[16],s[16];int l,m,t,tt,ans;bool b[16];
bool use[11][260];bool cf[11];
inline void print(){for(int i=0;i<m;i++) putchar(s[i]);putchar('\n');}
inline int pl(int fr,int to){if(fr==to) fr=1;int x=1;for(int i=fr;i<=to;i++) x*=i;return x;}
inline void dfs1(int now,int k){
    if(now==m){ans++;return;}
    for(int i=k;i<l;i++){
        if(!(b[i])&&(!use[now][a[i]])){use[now][a[i]]=true;s[now]=a[i];b[i]=true;dfs1(now+1,i+1);b[i]=false;s[now]='\0';}
    }
    memset(use[now],0,sizeof(use[now]));
}
inline void dfs(int now,int k){
    if(now==m){print();return;}
    for(int i=k;i<l;i++){
        if(!(b[i])&&(!use[now][a[i]])){use[now][a[i]]=true;s[now]=a[i];b[i]=true;dfs(now+1,i+1);b[i]=false;s[now]='\0';}
    }
    memset(use[now],0,sizeof(use[now]));
}
int main(){
    freopen("zht.in","r",stdin);freopen("zht.out","w",stdout);
    gets(a);l=strlen(a);scanf("%d",&m);sort(a,a+l);
    dfs1(0,0);cout<<ans<<endl;
    dfs(0,0);fclose(stdin);fclose(stdout);return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值