简单的深度优先搜索。求最大字典序,注意要先排序。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int SIZE=13; char a[5]; int vis[SIZE*2+10]; bool cmp(char a,char b) { return b > a; } int npow(int x,int n) { int res=1; while(n) { if(n&1) res*=x; x*=x; n>>=1; } return res; } bool check(long long target) { long long ans=0; for(int i=0;i<5;i++) { if((i+1)%2==1) ans+=npow(a[i]-‘A‘+1,i+1); else ans-=npow(a[i]-‘A‘+1,i+1); } if(ans==target) return true; return false; } char out[6]; void dfs(int i,char op[],long long target) { if(i==5) { if(check(target)) { for(int j=0;j<5;j++) out[j]=a[j]; } return ; } for(int j=0;op[j];j++) { int it=op[j]-‘A‘+1; if(!vis[it]) { vis[it]=1; a[i]=op[j]; dfs(i+1,op,target); vis[it]=0; a[i]=‘\0‘; } } } int main() { long long target; char op[SIZE]={‘\0‘}; while(scanf("%lld %s",&target,&op)!=EOF&&target!=0&&strcmp(op,"END")!=0) { sort(op,op+strlen(op),cmp); memset(out,‘\0‘,sizeof(out)); memset(a,‘\0‘,sizeof(a)); dfs(0,op,target); if(out[0]==‘\0‘) printf("no solution\n"); else printf("%s\n",out); memset(op,‘\0‘,sizeof(op)); } return 0; }
时间: 2024-10-10 21:45:22