题解 P6387 【[COCI2007-2008#4] VECI】

· · 题解

随便一看前几篇题解,居然都是没有 next\_permutation 函数,或者用了也很难懂得,于是就准备先写一篇试试, AC 了。

先介绍一下 next\_permutation

随便写的小模版 : next\_permutation(a,a+i)

这个函数就是将数组 a 的起始位置到结束位置的所有 数字 (注意,这里的数字是以每个数组元素为单位,也就是说如果 a 里有一个元素是 11 ,那 11 会被当做一个整体来排列) 排序成当前排列的下一个全排列。

还有要注意的一点,如果当前排列已经是最后一个全排列了,那它会将数组排列成第一个全排列并返回 false. (没错,它是有返回值的,但如果直接写一行那就不用管返回值了)

好,看到现在你应该已经知道怎么写了,最后一个点就是将数输入到数组里,有一种办法是一个一个字符输入并转换,但这样比较麻烦,所以我们采用了先输入一整个字符串再分别转换的方法。

注释代码如下(认真看注释哦):

#include <bits/stdc++.h>
using namespace std;
//next_permutation(a,a + 3)模板,不会打可直接复制
int main()
{
    string a;//定义
    cin >> a;//输入整个字符串
    int al = a.length();//al = A Length的首字母
    int num[al];//存储每位数字
    for(int i = 0;i < al;i++)//循环辅值
    {
        num[i] = a[i] - '0';//不需要记'0'的ASCII码,写'0'就行
    } 
    if(next_permutation(num,num + al))//关键的哦,这个函数是可以将num数组的变成下一个全排列,如果这个排列已经是最后那就返回false,反之亦然
    {
        for(int i = 0;i < al;i++)//循环输出
        {
            cout << num[i];//输出数字,记得不要加空格
        }
        return 0;//直接结束程序,可少打一层else
    }
    cout << '0';//如果是最后一个了(对应题目中的"若这样的数不存在"),那就输出0
    return 0;//结束
}

最后附上无注释的:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string a;
    cin >> a;
    int al = a.length();
    int num[al];
    for(int i = 0;i < al;i++)
    {
        num[i] = a[i] - '0';
    } 
    if(next_permutation(num,num + al))
    {
        for(int i = 0;i < al;i++)
        {
            cout << num[i];   
        }
        return 0;
    }
    cout << '0';
    return 0;
}

本人码风不压行带空格,写的时候看着清晰

看在我这么努力写题解的份上,给个赞再走呗 QWQ