HDU 1015 Safecracker (简单搜索题)

题目:HDU 1015 Safecracker

/*********************************************
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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值