C++置换的玩笑

小蒜头又调皮了。这一次,姐姐的实验报告惨遭毒手。

姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔。但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 1 到 100 的且首部没有空格的数字串。

现在姐姐已经怒了,蒜头找你写个程序快点把试验数据复原。

输入

输入文件有一行,为一个字符串——被蒜头搞乱的实验数据。

字符串的长度在 1 到 100 之间。

输出

输出共一行,为姐姐的原始测试数据—— 1 到 n 的输出。

任意两个数据之间有一个空格。

如果有多组符合要求的正确解,输出其中任意一组即可。

本题答案不唯一,符合要求的答案均正确

样例输入复制

4111109876532

样例输出复制

4 1 11 10 9 8 7 6 5 3 2

思路:

①因为是1到100的数列,所以可能是一位数也可能是两位数,给定的数字串,先用len计算出输出数的个数,之后用数字b来保存即将输出的数。

②用x代表即将输出的数,先判断之前输出数之中有没有一样的数,如果没有的话就用数组b 来保存x的值,随后用递归函数将下一个数传递给函数def;如果有的话,就说明x将要输出的数是两位数,就用x保存两个数字,用b来保存x的值,并且将下下个数传递给函数def。

③最后当判断出所有数字都用数组b保存完毕,按照输出一个b中的数就输出的一个空格的格式输出。

#include<iostream>
#include<string>
using namespace std;
char a[105];
int len, n, b[105];
bool f, vis[105];
void def(int s, int num)
{
    if (f) return ;
    if (s == len)
    {
        f = true;
        for (int i = 0;i < num;++i)
        {
            cout << b[i] << " ";
        }
        return ;
    }
    int x = a[s] - '0';
    if (!vis[x] && x <= n && x > 0)
    {
        vis[x] = true;
        b[num] = x;
        def(s + 1, num + 1);
        vis[x] = false;
    }
    x = x * 10 + a[s + 1] - '0';
    if (!vis[x] && x <= n && x > 0)
    {
        vis[x] = true;
        b[num] = x;
        def(s + 2, num + 1);
        vis[x] = false;
    }
}
int main() {
    cin >> a;
    len = strlen(a);
    n = (len <= 9 ? len:(len - 9) / 2 + 9);
    def(0, 0); 
}

猜你喜欢

转载自www.cnblogs.com/liushipeng648/p/12593432.html