排序后DFS
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int target;
char s[13];
int a[13], mark[13], length;
int ans[5];
int cmp( const void *a, const void *b ){
return *(int*)b - *(int*)a;
}
bool DFS( int number ){
if( number == 5 ){
int result = ans[0] - ans[1] * ans[1] + ans[2] * ans[2] * ans[2] - ans[3] * ans[3] * ans[3] * ans[3] + ans[4] * ans[4] * ans[4] * ans[4] * ans[4];
if( result == target ){
return true;
}else{
return false;
}
}
for( int i = 0; i < length; i++ ){
if( !mark[i] ){
mark[i] = 1;
ans[number] = a[i];
if( DFS( number + 1 ) ){
return true;
}
mark[i] = 0;
}
}
return false;
}
int main(){
while( scanf( "%d%s", &target, s ) && !( target == 0 && strcmp( s, "END" ) == 0 ) ){
length = strlen( s );
for( int i = 0; i < length; i++ ){
a[i] = s[i] - 'A' + 1;
}
qsort( a, length, sizeof( int ), cmp );
memset( mark, 0, sizeof( mark ) );
memset( ans, 0, sizeof( ans ) );
if( DFS( 0 ) ){
for( int i = 0; i < 5; i++ ){
printf( "%c", ans[i] + 'A' - 1 );
}
}else{
cout << "no solution";
}
cout << endl;
}
return 0;
}