您的位置:首页 > Web前端

hdoj 1015 safecracker(暴力枚举)

2017-12-05 22:40 429 查看
思路:对输入的字符串转换成ASCII码进行从大到小的排序(题目要求输出字母最大的情况);然后枚举所有情况,找到第一种符合的情况,输出,如果枚举完还没找到,就输出no solution。(自己写的快排,比较繁琐,见谅见谅)

代码如下:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swp(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
return;

}
void quick_sort(int *a,int low,int high)
{
int i;
int j;
int base;
i=low;
j=high;

if(low>high)
return;
base=a[low];
while(i<j)
{
while(i<j)
{
if(a[j]>base)
break;
j--;
}

while(i<j)
{
if(a[i]<base)
break;
i++;
}
if(i<j)
swp(&a[i],&a[j]);
if(i==j)
swp(&a[low],&a[i]);

}

quick_sort(a,low,i-1);
quick_sort(a,j+1,high);
return;

}

int main(int argc, char *argv[]) {
long n;
char s[20];
int a[20];
int len;
int i;
int i2,i3,i4,i5;
int flag;
while(scanf("%ld %s",&n,s) && n!=0 && s!="END")
{
len=strlen(s);
flag=0;
for(i=0;i<len;i++)
{
a[i]=s[i]-'A'+1;
}
quick_sort(a,0,len-1);
for(i=0;i<len;i++)
{
s[i]=(char)(a[i]+(char)('A')-1);
}

for(i=0;i<len;i++)
{

for(i2=0;i2<len;i2++)
{
if(i2==i)
continue;
for(i3=0;i3<len;i3++)
{
if(i2==i3 )
continue;
for(i4=0;i4<len;i4++)
{
if(i4==i3 )
continue;
for(i5=0;i5<len;i5++)
{
if(i5==i4)
continue;

if(s[i]-'A'+1-(s[i2]-'A'+1)*(s[i2]-'A'+1)+(s[i3]-'A'+1)*(s[i3]-'A'+1)*(s[i3]-'A'+1)-(s[i4]-'A'+1)*(s[i4]-'A'+1)*(s[i4]-'A'+1)*(s[i4]-'A'+1)+(s[i5]-'A'+1)*(s[i5]-'A'+1)*(s[i5]-'A'+1)*(s[i5]-'A'+1)*(s[i5]-'A'+1)==n)
{
flag=1;
printf("%c%c%c%c%c\n",s[i],s[i2],s[i3],s[i4],s[i5]);
break;
}

}
}
if(flag==1)
break;

}
if(flag==1)
break;
}
if(flag==1)
break;
}
if(flag==0)

printf("no solution\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: