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));
    }
}
posted @ 2012-08-01 20:21  某某。  阅读(247)  评论(0编辑  收藏  举报