输入
输入文件有一行,为一个字符串——被蒜头搞乱的实验数据。
字符串的长度在 1 到 100 之间。
输出
输出共一行,为姐姐的原始测试数据—— 1 到 n 的输出。
任意两个数据之间有一个空格。
样例1
输入:
4111109876532
输出:
4 1 11 10 9 8 7 6 5 3 2
其实挺简单的一道dfs,但是自己平时做dfs的题比较少,敲了好久,没敲出来,看了一下题解,发现竟然思路一样,就差一点没想出来了,怪自己没有继续想下去,此处使用res记录空格便于输出比较巧妙,dfs很简单。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
#include<set>
using namespace std;
int a[105],vis[100],res[105];
int bnum;
int flag;
int l;
string s;
void dfs(int k)
{
if(flag) return;
if(k>=l)
{
for(int i=0;i<l;i++)
{
cout<<a[i];
if(res[i]&&i!=l-1)
{
cout<<' ';
}
}
flag=true;
return;
}
int i=k;
if(!vis[a[i]]&&a[i]<=bnum&&(i+1>=l||a[i+1]!=0))
{
vis[a[i]]=1;
res[i]=1;
dfs(i+1);
vis[a[i]]=0;
res[i]=0;
}
if(!vis[a[i]*10+a[i+1]]&&(a[i]*10+a[i+1])<=bnum&&(i+2>=l||a[i+2]!=0))
{
vis[a[i]*10+a[i+1]]=1;
res[i+1]=1;
dfs(i+2);
vis[a[i]*10+a[i+1]]=0;
res[i+1]=0;
}
}
int main()
{
cin>>s;
memset(vis,0,sizeof(vis));
memset(res,0,sizeof(res));
flag=0;
for(int i=0;i<s.length();i++)
a[i]=s[i]-'0';
l=s.length();
if(s.length()<=9)
{
for(int i=0;i<l-1;i++)
cout<<a[i]<<' ';
cout<<a[l-1]<<endl;
}
else
{
bnum=9+(l-9)/2;
dfs(0);
}
return 0;
}