题意:有n个数(n<=50)写在一行,将两数之间的空格去掉得到一个数字串。根据这个数字串回复原数;
思路:先求数的个数,当串长度小于10时,均为个位数;当串长度大于9时,存在两位数,剪去9个个位数,同样得到数的个数;
数的个数也是串中的最大数;
采用枚举的方法将每个数与串中的位置匹配,属于同一个数的数字对应同一个数;
输出时,两位数的数字间不加空格;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char str[105]; int len,mark; int vis[505]; void dfs(int n) { if(n==0) { mark=1;return; } if(mark) return; if(n>=10) { char temp1=n/10+'0'; char temp2=n%10+'0'; for(int i=0;i<len-1;i++) { if(!vis[i]&&!vis[i+1]&&str[i]==temp1&&str[i+1]==temp2) { vis[i]=n; vis[i+1]=n; dfs(n-1); if(mark) return; vis[i]=0; vis[i+1]=0; } } } else{ for(int i=0;i<len;i++) { if(!vis[i]&&(str[i]-'0')==n) { vis[i]=n; dfs(n-1); if(mark) return; vis[i]=0; } } } } int main() { int i,j,k,num; freopen("joke.in","r",stdin); freopen("joke.out","w",stdout); while(scanf("%s",&str)!=EOF) { len=strlen(str); memset(vis,0,sizeof(vis)); mark=0; if(len<10) { num=len; } else num=(len-9)/2+9; dfs(num); printf("%c",str[0]); for(i=1;i<len;i++) { if(vis[i]==vis[i-1]) printf("%c",str[i]); else printf(" %c",str[i]); }printf(" "); } return 0; }