这道题目的错误找了1天多。。。我真菜
收获:
1:还是dfs的思想,回溯——标记——一直到底——返回及英国——返回成功就结束 返回不成功就褪去标记
2:用了map来将字母转换成对应的数字。
3:直接将输入的字符串str,根据sort(自己定义cmp函数)将str的每个字母排成倒叙 (例如BCA),这样就最先找到的就是最终的结果
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
#define maxn 27
bool cmp(char a,char b)//倒叙排序
{
return a>b;
}
map<char,int> change;
int traget;
char str[maxn];
int visited[maxn];
int temp[maxn];
char result[maxn];
int flag;
bool is(int a,int b,int c,int d,int e)
{
if(traget==a-b*b+c*c*c-d*d*d*d+e*e*e*e*e){
return true;
}else{
return false;
}
}
void dfs(int Cur)
{
if(Cur==5){
if( is(temp[0],temp[1],temp[2],temp[3],temp[4]) ){
flag=1;
int i;
for(i=0;i<5;i++){
result[i]=(char)(temp[i]+16+48);
}
}
return;
}else{
int i;
for(i=0;i<strlen(str);i++){
if(0==visited[change[str[i]]]){//如果还没访问
temp[Cur]=change[str[i]];//temp记录获得的对应值,
visited[change[str[i]]]=1;
dfs(Cur+1);
if(flag==1){
return;
}
visited[change[str[i]]]=0;
}
}
}
}
void init()
{
int i;
char t='A';
for(i=1;i<=26;i++){
change[t++]=i;
}
}
int main()
{
init();//先打表
while(cin>> traget >> str &&(traget || 0!=strcmp("END",str) ))
{
sort(str,str+strlen(str),cmp);//从大到小排顺序
flag=0;
dfs(0);
if(0==flag){
cout << "no solution" << endl;
}else{
int i;
for(i=0;i<5;i++){
printf("%c",result[i]);
}
printf("\n");
}
memset(visited,0,sizeof(visited));
memset(str,'\0',sizeof(str));
}
return 0;
}