HDOJ-1015 Safecracker(DFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1015

题意:给出一个目标值target和一个由大写字母组成的字符串 A-Z分别对应权值1-26

要求从给出的字符串中选出5个字符,它们的权值v,w,x,y,z应符合下列式子

v - w^2 + x^3 - y^4 + z^5 = target

同一个字符只能被选取一次

输出符合要求的5个字符

 

简单深搜模拟选取操作

# include <stdio.h>
# include <string.h>

int Target, Len, Ans[6], Flag[20], Value[20];

int Dfs(int Count)
{
	if(Count == 6)//判断选择的5个数是否符合式子
	{
		if(Ans[1] - Ans[2]*Ans[2] + Ans[3]*Ans[3]*Ans[3] - Ans[4]*Ans[4]*Ans[4]*Ans[4] + Ans[5]*Ans[5]*Ans[5]*Ans[5]*Ans[5] == Target)
		{
			printf("%c%c%c%c%c\n",Ans[1] + 'A' - 1, Ans[2] + 'A' - 1, Ans[3] + 'A' - 1, Ans[4] + 'A' - 1, Ans[5] + 'A' - 1);
			return 1;
		}
		return 0;
	}

	for(int i = 0; i <= Len - 1; i++)
	{
		if(Flag[i] == 0)
		{
			Flag[i] = 1;
			Ans[Count] = Value[i];

			//依次选取一个数
			if(Dfs(Count + 1))
				return 1;

			Flag[i] = 0;
		}
	}

	return 0;
}

int main ()
{
	char str[20];
	while(scanf("%d %s",&Target, str) && (Target != 0 || strcmp(str, "END")))
	{	//str为可选字母表 A-Z对应1-26
		memset(Flag, 0, sizeof(Flag));
		Len = strlen(str);

		for(int i = 0; i <= Len - 1; i++)
			Value[i] = str[i] - 'A' + 1;

		//按权从小到大排序
		for(int i = 0; i <= Len - 2; i++)
		{
			for(int j = i + 1; j <= Len - 1; j++)
			{
				if(Value[i] < Value[j])
				{
					int t = Value[i];
					Value[i] = Value[j];
					Value[j] = t;
				}
			}
		}

		if(!Dfs(1))
			printf("no solution\n");
	}

	return 0;
}

  

posted @ 2015-04-28 17:31  懒人の猫  阅读(184)  评论(0编辑  收藏  举报