1、先输出只有长度为1的情况
2、输出所有无法构造的情况:
3、把所有偶数情况按数字本身的大小排序,若只有一个奇数情况,记录奇数情况的这个数字,让它数量减一变成偶数,成为偶数情况,与其他偶数一起从小到大排序
4、从小到达做一半?回文,加入这个奇数,再加上从大到小做的另一半回文
5、最后插入0,在第一个数字后面一位插入一半0,最后一个数字前面一位插入另一半0.
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
typedef pair<int,int> PII;
PII q1[10],q2[2],q3[2];
int main()
{
int a[10];
int res = 0;
for(int i = 0;i<10;i++) scanf("%d",&a[i]),res += a[i]; // 输入十个数字,并统计长度
// 不能构造的情况
int cnt = 0,pt = 0,k1 = 0,k2 = 0,k3 = 0;// k1存偶数,k2存奇数,k3存0的数量 ,cnt存放奇数的数量
for(int i = 0;i<10;i++)
{
if(a[i]%2==1&&a[i]>=1){ // 如果是奇数并且大于等于1
cnt++; // 统计奇数的个数
pt = i; // 记录那个奇数
if(i!=0&&a[i]>1) // 不是0的奇数个数减一变成偶数,放入q1中 ,,非0数奇数变偶数
q1[k1++] = {i,a[i]-1};
q2[k2++] = {i,a[i]}; // 让q2中的奇数入队
}
else if(i!=0&&a[i]%2==0&&a[i]!=0) // 不是0且偶数,入q1队
{
q1[k1++] = {i,a[i]};
}
if(i==0&&a[i]!=0) // 如果是0 则直接入q3队,无论奇数偶数
{
q3[k3++] = {i,a[i]};
}
}
if(cnt==1&&res==1&&a[0]!=0) // 输出只有一个0的情况
{
cout<<0<<endl;
return 0;
}
if(cnt==1&&res==1&&a[0]==0) // 输出只有一个其他数字的情况 ,只有一个其他数字,必然该数字在q2的第一个里面
{
cout<<q2[0].first<<endl;
return 0;
}
if(cnt>1||q1[0].second==0) // 无效的情况则是 奇数的数量大于1,有前导0,前导0对应的情况是多个0并且一个其他位数
{// 这一个其他位数是1,当然也是奇数,因此放入q1中变成个数为0
cout<<"-1"<<endl;
return 0;
}
sort(q1,q1 + k1); //所有非0的数从小到大排列
string s = "";
if(k2==1&&q2[0].second==1||q2[0].second>=3) s += string(1,pt + '0'); // 如果有奇数的情况,先加入一个奇数
string s1 = "";// 再定义一个字符串
for(int i = 0;i<k1;i++) s1 += string(q1[i].second/2,q1[i].first+'0'); // 正的加入一次
s1 += s;
for(int i = k1-1;i>=0;i--)s1 += string(q1[i].second/2,q1[i].first+'0'); // 反着加入一次
if(k3==1) s1.insert(1,q3[0].second/2,'0'),s1.insert(s1.size()-1,q3[0].second/2,'0'); // 最后把多余的0在首后尾前加入
cout<<s1<<endl;
return 0;
}