UVA - 10098 - Generating Fast(全排列)

本文详细介绍了如何使用next_permutation函数高效解决UVA-10098全排列问题,包括int、char及string类型的示例代码,并提供了完整的AC代码。

UVA - 10098 - Generating Fast(全排列)

Generating permutation has always been an important problem in computer science. In this problem you will have to generate the permutation of a given string in ascending order. Remember that your algorithm must be efficient.

Input

The first line of the input contains an integer n, which indicates how many strings to follow. The next n lines contain n strings. Strings will only contain alpha numerals and never contain any space. The maximum length of the string is 10.

Output

For each input string print all the permutations possible in ascending order. Not that the strings should be treated, as case sensitive strings and no permutation should be repeated. A blank line should follow each output set.

Sample Input

3
ab
abc
bca

Sample Output

ab
ba

abc
acb
bac
bca
cab
cba

abc
acb
bac
bca
cab
cba


题意:给出一串字符串,要求按字典序从小到大输出字符串的全排列

偷下懒,用 next_permutation 可以很好解决,具体操作过程是先将字符串中的所有字符按字典序排序,调用那个函数就好,下面总结一下 next_permutation的用法


next_permutation函数总结

int类型

int main()
{
    int a[3];
    a[0]=1; a[1]=2; a[2]=3;
    do{
        printf("%d%d%d\n", a[0], a[i], a[2]);
    }while (next_permutation(a,a+3));
    //如果存在a之后的排列,就返回true。如果a是最后一个排列没有后继,返回false,每执行一次,a就变成它的后继
}

输出:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

如果改成 while(next_permutation(a,a+2));
输出:

1 2 3
2 1 3

只对前两个元素进行字典排序

显然,如果改成 while(next_permutation(a,a+1)); 则只输出:1 2 3

若排列本来就是最大的了没有后继,则next_permutation执行后,会对排列进行字典升序排序,相当于循环

int list[3]={3,2,1};
next_permutation(list,list+3);
printf("%d %d %d\n", list[0], list[1], list[2]);

//输出: 1 2 3

char类型

int main()
{
    char str[205];
    scanf("%s", str);

    int len = strlen(str);
    sort(str, str+len);
    //该语句对输入的数组进行字典升序排序。如输入9874563102 puts(str); 将输出0123456789,这样就能输出全排列了

    do {
        puts(str);
    }while(next_permutation(str, str+len));

    return 0;
}

若采用 while(next_permutation(str, str+5)); 如果只输入1562,就会产生错误,因为str中第五个元素指向未知
若要整个字符串进行排序,参数5指的是数组的长度,不含结束符

string类型

int main()
{
    string line;
    while(cin>>line && line!="#")
    {
        if(next_permutation(line.begin(), line.end())) //从当前输入位置开始
            cout<<line<<endl;
        else    cout<<"Nosuccesor\n";
    }
}



int main()
{
    string line;
    while(cin>>line && line!="#")
    {
        sort(line.begin(), line.end());//全排列
        cout<<line<<endl;
        while(next_permutation(line.begin(), line.end()))
            cout<<line<<endl;
    }
}

以下是这道题的AC代码,用while 和 do-while 都OK,就是注意用while的时候记得把第一个输出来


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    char str[15];
    int n;
    scanf("%d", &n);
    getchar();
    while(n--){
        gets(str);
        int len = strlen(str);
        sort(str, str+len);
        puts(str);
        while(next_permutation(str, str+len)){
            puts(str);
        }
        printf("\n");
    }
    return 0;   
}
基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不依赖物理位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估计与控制。文中结合嵌入式开发平台STM32 F4,采用如滑模观测器、扩展卡尔曼滤波或高频注入法等先进观测技术,实现对电机反电动势或磁链的估算,进而完成无传感器矢量控制(FOC)。同时,研究涵盖系统建模、控制算法设计、仿真验证(可能使用Simulink)以及在STM32硬件平台上的代码实现与调试,旨在提高电机控制系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电力电子、自动控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师。; 使用场景及目标:①掌握永磁同步电机无位置传感器控制的核心原理与实现方法;②学习如何在STM32平台上进行电机控制算法的移植与优化;③为开发高性能、低成本的电机驱动系统提供技术参考与实践指导。; 阅读建议:建议读者结合文中提到的控制理论、仿真模型与实际代码实现进行系统学习,有条件者应在实验平台上进行验证,重点关注观测器设计、参数整定及系统稳定性分析等关键环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值