hdu 1015 Safecracker

来源:互联网 发布:华宇软件 待遇 编辑:程序博客网 时间:2024/06/06 12:57
题意:就是在输入一个整数target和一段长度大于等于5,小于等于20的字符串,然后在这段字符串中挑出出5个字母,A=1,B=2...Z=26,只要符合v - w^2 + x^3 - y^4 + z^5 = target

这条公式,就输入对应的五个字母,如果有多项符合的结果,就输出字典中最大的那组。

#include<stdio.h>
#include<string.h>
#include<math.h>
int target,flag;
char ans[30];
int f(char c)
{
return c-'A'+1;
}
void panduan(char s[])
{
char a[30];
int len=strlen(s);
for(int v=0;v<len;v++)//暴力解,解释多重循环找出5个不同的值即可//

for(int w=0;w<len;w++)
{
if(v==w)
continue;
for(int x=0;x<len;x++)
{
if(x==v||x==w)
continue;
for(int y=0;y<len;y++)
{
if(y==x||y==v||y==w)
continue;
for(int z=0;z<len;z++)
{
if(z==y||z==v||z==w||z==x)
continue;

if(int(f(s[v]))-int(f(s[w])*f(s[w]))+int(pow(f(s[x]),3))-int(pow(f(s[y]),4))+int(pow(f(s[z]),5))==target)//!!注意:用pow得出来的值是浮点数,故要用int来强制转化一下,否者会产生误差,使结果不相等//
{
flag=1;
a[0]=s[v];
a[1]=s[w];
a[2]=s[x];
a[3]=s[y];
a[4]=s[z];
a[5]='\0'; //!!注意用字符串的对应位置赋值时,注意在结尾加上这段,否者会在后面出现乱码//
if(strcmp(a,ans)>0)
{
strcpy(ans,a);
}
}
}
}
}
}
}  
}
int main()
{
char s[30];
while(scanf("%d%s",&target,s)!=EOF)
{
if(target==0&&strcmp(s,"END")==0)
break;
memset(ans,0,sizeof(ans));//!!注意这一段不能少,防止上一组数据的结果影响下一组的结果//
flag=0;
panduan(s);
if(flag)
printf("%s\n",ans);
else 
printf("no solution\n");
}
}

0 0
原创粉丝点击