POJ 1248 Safecracker
题意:给定一个长度为5……12个不同字符组成的字符串,从中选取5个,设为v,w,x,y,z,要满足等式:v-w^2+x^3-y^4+z^5=target,现在给出字符串和target,求满足该条件的5个字符(字典序要最大)
深度搜索题
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int num[5];
int letters[26];
char ss[15];
int target;
int power(int a,int n) //计算a^n
{
int i,ans=1;
for(i=1;i<=n;i++)
ans*=a;
return ans;
}
int dfs(int d) //参数d表示已经选好前d-1个数,现在将要选第d个数
{
int i,sum;
if(d==5)
{
sum=num[0]-power(num[1],2)+power(num[2],3)-power(num[3],4)+power(num[4],5);
if(sum==target)
return 1;
return 0;
}
for(i=25;i>=0;i--)//从后面搜索所有的字母,保证找到的第一个解就是字典序最大的解
{
if(letters[i])//即letters[i]所对应的字母没选用
{
letters[i]--;//选择letters[i]
num[d]=i+1; //存放letters[i]字母对应的整数
if(dfs(d+1))
return 1;
letters[i]++; //放弃letters[i]
}
}
return 0;
}
int main()
{
int i,len;
char ch;
while(scanf("%d%s",&target,ss)!=EOF)
{
if(target==0&&strcmp(ss,"END")==0)
break;
len=strlen(ss);
memset(letters,0,sizeof(letters));
for(i=0;i<len;i++)
letters[ss[i]-'A']++;//记录输入的字母
if(dfs(0))
{
for(i=0;i<5;i++)
{
ch=num[i]-1+'A';
printf("%c",ch);
}
printf("\n");
}
else
printf("no solution\n");
}
return 0;
}