小蒜头又调皮了。这一次,姐姐的实验报告惨遭毒手。
姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔。但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 1 到 100 的且首部没有空格的数字串。
现在姐姐已经怒了,蒜头找你写个程序快点把试验数据复原。
输入格式
输入文件有一行,为一个字符串——被蒜头搞乱的实验数据。
字符串的长度在 1 到 100 之间。
输出格式
输出共一行,为姐姐的原始测试数据—— 1 到n 的输出。
任意两个数据之间有一个空格。
如果有多组符合要求的正确解,输出其中任意一组即可。
本题答案不唯一,符合要求的答案均正确
样例输入
4111109876532
样例输出
4 1 11 10 9 8 7 6 5 3 2
思路
因为字符串的长度不超过100,可以计算出 n 最大是 54,我们只需要枚举一位数和两位数。先通过字符串的长度计算出 n,开一个数组标记枚举过的数,只有没标记过的数并且小于等于 n 才会存下来继续往后搜。
#include<bits/stdc++.h>
using namespace std;
string s;
int len;
int n;
bool vis[100],f;
int ans[100];
void dfs(int cnt,int ind)//cnt:分了多少个数,ind:当前在什么位置
{
if(f){//如果有解则退出
return;
}
if(ind==len){//如果能够分完,则输出
for(int i=0;i<cnt;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
f=true;
return;
}
int x=s[ind]-'0';//分一个数
if(x<=n&&x>=1&&!vis[x]){
ans[cnt]=x;
vis[x]=true;
dfs(cnt+1,ind+1);
vis[x]=false;
}
if(ind+1>=len) return; //提前判断能否分两个数
x=x*10+s[ind+1]-'0';//分两个数
if(x<=n&&x>=1&&!vis[x]){
ans[cnt]=x;
vis[x]=true;
dfs(cnt+1,ind+2);
vis[x]=false;
}
}
int main(){
cin>>s;
len=s.length();
n=len<=9?len:(len-9)/2+9;//判断1-n的序列n为多少
dfs(0,0);
return 0;
}