http://www.jisuanke.com/minicourse/63/392
测试数据没通过,不知道为什么,做了快一天了
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstring>
#include<vector>
#define MAXN 1002
using namespace std;
vector<int> index3;
vector<int> index2;
string str;
//打印输出
bool getnum(string str){
for (int i = 0; i < str.length(); i++)
{
bool find = false;
for (int j = 0; j < index3.size(); j++)//双数里找有没有这个数
{
if (i == index3[j]){
printf("%c%c ", str[i], str[i + 1]);
i++; find = true; break;
}
}
if (!find){//在双数中没有找到
for (int j = 0; j < index2.size(); j++)//双数里找有没有这个数
{
if (i == index2[j]){
printf("%c ", str[i]);
break;
}
}
}
}
return 0; }
bool dp(int num, string s){
if (num == 0)return true;
if (num <= 9){
int len = s.length();
int i = 0;
bool flag = false;
for (; i < len; i++){
if (s[i] == (num % 10 + '0') ){//要找的数字小于9
s[i] = ' ';
index2.push_back(i);
if (!dp(num - 1, s)){//没找到
flag = false;
index2.pop_back();
s[i] = num % 10 + '0';
}
else{//找到了
flag = true;
break;
}
}
}
return flag;
}
else{
int len = s.length();
int i = 0;
bool flag = false;
for (; i < len; i++){
if (s[i] == (num / 10 + '0') && s[i + 1] == (num % 10 + '0')){//要找的数字大于9
s[i] = s[i + 1] = ' ';
index3.push_back(i);
if (!dp(num - 1, s)){//没找到
flag = false;
index3.pop_back();
s[i] = num / 10 + '0';
s[i + 1] = num % 10 + '0';
}
else{//找到了
flag = true;
break;
}
}
}
return flag;
}
}
int main(){
freopen("d://uva_in.txt", "r", stdin);
int n;
char s[105];
while (scanf("%s", s)>0){
int num = (strlen(s) - 9) / 2 + 9;
str = s;
index2.clear();
index3.clear();
dp(num,s);
getnum(str); printf("\n");
}
}