比较简单的回溯题,就是没有注意题目中的最大字典序,卡了好几次,不过A掉之后也长了自信
#include <iostream>
#include <cstring>
using namespace std;
int per[30][8];
int vis[15],num[5],t[5];
char a[15];
int n,sum,flag;
bool check() //判断字典序
{
for(int i=0;i<5;i++)
{
if(num[i]>t[i])return 1;
if(num[i]<t[i])return 0;
}
}
void init() //打1——26的5次幂的表
{
for(int i=1;i<=26;i++)
{
per[i][0]=1;
for(int j=1;j<=5;j++)
per[i][j]=per[i][j-1]*i;
}
}
void dfs(int cur)
{
if(cur==5)
{
int k=per[num[0]][1]-per[num[1]][2]+per[num[2]][3]-per[num[3]][4]+per[num[4]][5];
if(k==sum&&check())
{
for(int j=0;j<5;j++)
t[j]=num[j];
flag=1;
}
return;
}
for(int i=0;i<n;i++)
{
if(!vis[i])
{
num[cur]=a[i]-'A'+1;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
}
int main()
{
init();
while(cin>>sum>>a)
{
if(!sum&&strcmp(a,"END")==0)break;
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
memset(t,0,sizeof(t));
n=strlen(a);
flag=0;
dfs(0);
if(flag==1)
for(int i=0;i<5;i++)cout<<(char)(t[i]+'A'-1);
else cout<<"no solution";
cout<<endl;
}
return 0;
}