用dfs搜索出两个数字在进行比大小,用ans记录每次相减的最小结果并且输出,当需要排的数字只有1或者2个时候可以进行直接输出,其他进行dfs
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdio>
const int INF=0x3f3f3f3f;
using namespace std;
int bos[7]={1,10,100,1000,10000,100000,1000000};//进位,剪枝需要
int visa[20],visb[20];
int num[20];
int vala,valb;
int cnta,cntb;
int ans=INF;
int len;
char s[100];
void dfsb(int deep,int sumb)
{
if(deep>0&&abs(vala-sumb*bos[cntb-deep])>=ans)
return;/*当sumb中已经存了几个数的时候,如果他的数字大于ans
就直接结束这次遍历,bos[cntb-deep]代表他剩下的还要填的数字
不用考虑加数字,直接把它抬到他对应的数字长度*/
if(deep==cntb)
{
ans=ans=min(ans,max(vala,sumb)-min(vala,sumb));
return;
}
for(int i=0;i<len;i++)
{
if(!visa[i]&&!visb[i])
{
if(deep==0&&num[i]==0)
continue;
visb[i]=1;
dfsb(deep+1,num[i]+10*sumb);
visb[i]=0;
}
}
}
void dfsa(int deep,int suma)
{
if(deep==cnta)
{
vala=suma;
memset(visb,0,sizeof(visb));
dfsb(0,0);
return;
}
for(int i=0;i<len;i++)
{
if(!visa[i]&&!visb[i])
{
if(deep==0&&num[i]==0)
continue;
visa[i]=1;
dfsa(deep+1,num[i]+10*suma);
visa[i]=0;
}
}
}
int main()
{
int t;
cin>>t;
getchar();
while(t--)
{
len=0;
memset(visa,0,sizeof(visa));
memset(num,0,sizeof(num));
gets(s);
for(int i=0;i<strlen(s);i++)
if('0'<=s[i]&&s[i]<='9')
{
num[len]=s[i]-'0';
len++;
}
/*
for(int i=0;i<len;i++)
cout<<num[i];
cout<<endl;
*/
cnta=len/2;
cntb=len-len/2;
if(len==1)
cout<<num[0]<<endl;
else if(len==2)
cout<<abs(num[0]-num[1])<<endl;
else
{
ans=INF;
dfsa(0,0);
cout<<ans<<endl;
}
}
return 0;
}