简单DFS,直接暴力搜索解就行了。。好久没写搜索题,还好没生疏,嘿嘿
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
static int target, find, flag[13], ans[5], len;
static char s[13];
static int cmp(const void *p1, const void *p2)
{
return *(char *) p2 - *(char *) p1;
}
static int equal()
{
return 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] == target;
}
static void dfs(int depth)
{
int i;
if (find)
return;
if (depth == 5)
{
if (equal())
{
find = 1;
for (i = 0; i < 5; i++)
putchar(ans[i] - 1 + 'A');
putchar('\n');
}
return;
}
for (i = 0; i < len; i++)
{
if (!flag[i])
{
flag[i] = 1;
ans[depth] = s[i] - 'A' + 1;
dfs(depth + 1);
flag[i] = 0;
}
}
}
int main()
{
while (scanf("%d %s", &target, s), target != 0 || strcmp(s, "END"))
{
len = strlen(s);
qsort(s, len, sizeof(char), cmp);
memset(flag, 0, sizeof(flag));
find = 0;
dfs(0);
if (!find)
puts("no solution");
}
return 0;
}