这个题还是使用dfs吧, 用stl算法里面的next_permutation()可惜会超时;在运算的时候加入快速幂运算,不过好像对这个题的时间没什么加速,大概是数据上的原因吧;
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int tar;
char str[15];
char ans[5];
int len;
bool s[15];
bool flag ;
int cal(char num, int k)
{
int t = 1;
int base=(num-'A'+1);//快速幂运算
while (k!=0)
{
if (k&1)
t*=base;
base*=base;
k/=2;
}
return t;
}
int cmp(char a, char b)
{
return a>b;
}
void fun(int n)
{
if(n == 5)
{
int num = cal(ans[0], 1) - cal(ans[1],2) + cal(ans[2],3) - cal(ans[3],4) + cal(ans[4],5);
if(num == tar)
flag = 1;
return;
}
for(int j=0; j<len; ++j)
if(s[j] == 0)
{
ans[n] = str[j];
s[j] = 1;
fun(n+1);
if(flag == 1)
return;
s[j] = 0;
}
}
int main()
{
while(scanf("%d %s", &tar, str) && !((tar==0)&&(strcmp(str, "END")==0)))
{
memset(s, 0, sizeof(s));
memset(ans, 0, sizeof(ans));
flag = 0;
len = strlen(str);
sort(str, str+len, cmp);
fun(0);
if(flag)
cout << ans << endl;
else
cout << "no solution\n";
}
return 0;
}