/*********************************************
Problem from : hdu 1015 Safecracker
Problem describe :
给定一个数字target以及一串字符(均为大写字母);
求是否能从这串字符中找到满足
v - w^2 + x^3 - y^4 + z^5 = target的五个字符;
是则输出vwxyz; 否则输出no solution.
*********************************************/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<stack>
#include<queue>
#include<ctime>
#include<cstring>
#include<string>
#define LL __int64
#define INF 0x3f3f3f3f3f
using namespace std;
//从大到小排序
bool cmp(char a, char b){
return a>b;
}
//判断是否满足条件
bool judge(char c[], int n)
{
LL v = c[0]-'A'+1;
LL w = c[1]-'A'+1;
LL x = c[2]-'A'+1;
LL y = c[3]-'A'+1;
LL z = c[4]-'A'+1;
if((v-w*w+x*x*x-y*y*y*y+z*z*z*z*z-n)==0) return true;
else return false;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int i, j, k,x, y, n, m;
char c[20];
while(~scanf("%d %s", &n, c))
{
//strcmp函数判断c[]与END是否相等,若相等则返回0
if(n==0 && !strcmp(c, "END")) break;
//给字符串中的字母排序
//解决同时满足条件时取字典序最大的字符串
int len = strlen(c);
sort(c, c+len, cmp);
bool flag = false; //判断是否满足
char ans[5];//储存
//五重循环搜索, 一旦遇到满足条件的即可退出循环
//循环中的continue旨在避免重复选取同一字母
for(i=0; i<len; i++)
{
ans[0]=c[i];
for(j=0; j<len; j++)
{
if(j==i) continue;
ans[1]=c[j];
for(k=0; k<len; k++)
{
if(k==j || k==i) continue;
ans[2]=c[k];
for(x=0; x<len; x++)
{
if(x==k || x==j || x==i) continue;
ans[3]=c[x];
for(y=0; y<len; y++)
{
if(y==x || y==k || y==j || y==i) continue;
ans[4]=c[y];
if(judge(ans,n))
{
flag = true;
break;
}
}
if(flag) break;
}
if(flag) break;
}
if(flag) break;
}
if(flag) break;
}
if(flag) printf("%s\n", ans);
else printf("no solution\n");
//清空字符数组c
memset(c, '\0', sizeof(c));
}
return 0;
}
HDU 1015 Safecracker (简单搜索题)
最新推荐文章于 2021-05-31 18:00:25 发布