HDU 1015 Safecracker DFS
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1015
题目的大意就是给以一串字符串和一个目标数字,让你从中找出5个字母,依次可以满足v - w^2 + x^3 - y^4 + z^5 = target这个关系式
如果有多个就按字典序最大的输出。。。
View Code
#include <stdio.h> #include <string.h> #include <stdlib.h> int vis[100005]; char str[100005]; int sum,leap; char end[10],temp[10]; int cmp(const void *a,const void *b) { return *(char *)b-*(char *)a; } void dfs(int step,int sum,int target) { int i; if(step >= 5) { if(sum == target) { leap = 1; temp[step] = '\0'; if(strcmp(temp,end) > 0) strcpy(end,temp); return; } return; } for(i = 0;str[i] != '\0';i++) { if(!vis[i]) { temp[step] = str[i]; vis[i] = 1; if(step == 4) { dfs(step+1,sum+(str[i]-'A'+1)*(str[i]-'A'+1)*(str[i]-'A'+1)*(str[i]-'A'+1)*(str[i]-'A'+1),target); } else if(step == 3) { dfs(step+1,sum-(str[i]-'A'+1)*(str[i]-'A'+1)*(str[i]-'A'+1)*(str[i]-'A'+1),target); } else if(step == 2) { dfs(step+1,sum+(str[i]-'A'+1)*(str[i]-'A'+1)*(str[i]-'A'+1),target); } else if(step == 1) { dfs(step+1,sum-(str[i]-'A'+1)*(str[i]-'A'+1),target); } else if(step == 0) { dfs(step+1,sum+(str[i]-'A'+1),target); } vis[i] = 0; } } } int main() { int target,j,k,i; while(scanf("%d %s",&target,str) != EOF) { if(target == 0 && strcmp(str,"END") == 0) break; memset(end,0,sizeof(end)); qsort(str,strlen(str),sizeof(str[0]),cmp); sum = 0; leap = 0; for(i = 0;str[i] != 0;i++) { dfs(0,sum,target); } if(leap) puts(end); else puts("no solution"); memset(vis,0,sizeof(vis)); memset(str,0,sizeof(str)); } }