全排列算法很多。之前不了解。仅仅知道枚举算法。现在要学习dfs。那么全排列可以用递归实现。但是写题过程中发现了C++之中有实现全排列的STL: next_permutation.
结合sort()函数和do{}while();循环使用。
POJ2718
题意:给出一组数字。把数字分成两组,各代表一个新的数字,求出两个数最小差值。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
// freopen("in.txt","r",stdin);
char a[100];
int b[100];
int ncase;
cin>>ncase;
getchar();
while(ncase--){
gets(a);
int length1 = strlen(a);
int length2 = 0;
for(int i = 0;i < length1; i++){
if(a[i] >= '0' && a[i] <= '9')
b[length2++] = a[i] - '0';
}
sort(b,b+length2); //需要排序
int ans = 0x3f3f3f3f;
do{
int n1 = 0,n2 = 0;
if( (b[0] == 0 || b[length2/2] == 0) && length2 > 2) //两个数平分长度才会使差值最小
continue;
for(int i = 0;i < length2/2; i++){
n1 = n1*10 + b[i];
}
for(int i = length2/2;i < length2; i++){
n2 = n2*10 + b[i];
}
ans = min(ans,abs(n1-n2));
}while(next_permutation(b,b+length2)); //STL全排列
cout<<ans<<endl;
}
return 0;
}