原题: http://poj.org/problem?id=2718
//poj 2718
//题目大意:给你固定的n个数,用这n个数组成两个整数,求出所有情况中 两数绝对值最小的情况并输出该值。
//...没解出来,评论区说贪心不好做,用全排列,一开始我感觉全排列会超时,没想到试了全排列还真行,是自己大意了。
//注意组成的两个数不能以0为开头,
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
#define qwq 0x7fffffff
using namespace std;
int strlen(char *str)
{
int i=0;
while(str[i]!='\0')
{
i++;
}
return i;
}int main()
{
int t;
scanf("%d",&t);
getchar();
int a[11];
while(t--)
{
char str[1001];
gets(str);
int pos=0;
//输入
int len=strlen(str);
for(int i=0;i<len;i++)//将字符串转化为 整数数组
{
if(str[i]>='0' && str[i]<='9')
{
a[pos++]=str[i]-'0';
}
}
//全排列
if(pos==2) //只有两个数的情况
{
printf("%d\n",abs(a[1]-a[0]));
continue;
}
int small=qwq;
int yiban=pos/2;
do{
if(a[0]!=0 && a[yiban]!=0){//开头不能是 0
int num1=0;
int num2=0;
for(int i=0;i<yiban;i++)
{
num1=num1*10+a[i];
}
for(int i=yiban;i<pos;i++)
{
num2=num2*10+a[i];
}
if(small>abs(num1-num2))
{
small=abs(num1-num2);
}
}
}while(next_permutation(a,a+pos));
printf("%d\n",small);
}
return 0;
}