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;

}

  

你可能感兴趣的:(rack)