#include <stdio.h>
#define MAX_LETTERS 13
#define CHAR_TO_INT(c) ( (c) - 'A' + 1 )
int target;
char letters[MAX_LETTERS];
int len;
int strCmp(char *from, char *to){
while (*from == *to){
if (*from == '\0'){
return 0;
}
from++;
to++;
}
return (*from - *to);
}
int myPow(int base, int exponent){
int result = 1;
while (exponent--){
result *= base;
}
return result;
}
int strLen(char *str){
char *p = str;
while (*p != '\0'){
p++;
}
return (p - str);
}
void bubbleSortLetters( ){
len = strLen(letters);
int time;
for (time = 1; time < len; time++){
int needContinue = 0;
int compare;
for (compare = 0; compare < len - 1; compare++){
if (letters[compare] < letters[compare + 1]){
needContinue = 1;
int temp = letters[compare];
letters[compare] = letters[compare + 1];
letters[compare + 1] = temp;
}
}
if (!needContinue){
break;
}
}
}
int main(){
//freopen("input.txt", "r", stdin);
while (1){
scanf("%d %s", &target, letters);
if (target == 0 && strCmp(letters, "END") == 0){
return 0;
}
bubbleSortLetters( );
int found = 0;
int v, w, x, y, z;
for (v = 0; v < len; v++){
//能放到外循环的计算就不要放在内循环
int valueV = myPow( CHAR_TO_INT( letters[v] ), 1);
for (w = 0; w < len; w++){
if (w == v){
//剪枝,下面的contine都是剪枝
continue;
}
int valueW = myPow( CHAR_TO_INT( letters[w] ), 2);
for (x = 0; x < len; x++){
if (x == v || x == w){
continue;
}
int valueX = myPow( CHAR_TO_INT( letters[x] ), 3);
for (y = 0; y < len; y++){
if (y == v || y == w || y== x){
continue;
}
int valueY = myPow( CHAR_TO_INT( letters[y] ), 4);
for (z = 0; z < len; z++){
if (z == v || z == w || z == x || z == y){
continue;
}
int valueZ = myPow( CHAR_TO_INT( letters[z] ), 5);
if ((valueV - valueW + valueX - valueY + valueZ ) == target){
found = 1;
goto output;
}
}// for z
}// for y
}// for x
}// for w
}// for v
output:
if (found){
printf("%c%c%c%c%c\n", letters[v], letters[w], letters[x], letters[y], letters[z]);
} else {
printf("no solution\n");
}
}
}
POJ 1248 Safecracker
最新推荐文章于 2020-04-13 20:39:18 发布