小蒜头又调皮了。这一次,姐姐的实验报告惨遭毒手。
姐姐的实验报告上原本记录着从 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); }