HDU 1015 爆搜 /dfs+回溯

题目描述好长0-0,看的好累。
看完题目,在草稿纸上写了 dfs bfs  爆搜几个字。一想爆搜也就26^5次循环。于是就写了,写完觉得可能数据会有坑过不了,但是没想到31MS过了。

看到有人用dfs写了0MS过了。

http://blog.csdn.net/vsooda/article/details/7996922

另外,这道题目可以学的比较基础的地方就是 字符和整数 之间的转换吧,以及代码书写的优美性。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll __int64
int num[30];
int cal(int v,int w,int x,int y,int z)
{
    return v-w*w+x*x*x-y*y*y*y+z*z*z*z*z;
}
bool cmp(int a,int b)
{
    return a>b;
}

void sovle(int len,int t)
{
    for(int i=0;i<len;i++)
        {
            for(int j=0;j<len;j++)
            {
                if(i==j) continue;
                for(int k=0;k<len;k++)
                {
                    if(k==j||k==i) continue;
                    for(int m=0;m<len;m++)
                    {
                        if(m==i||m==j||m==k) continue;
                        for(int n=0;n<len;n++)
                        {
                            if(n==i||n==j||n==k||n==m) continue;
                            if(cal(num[i],num[j],num[k],num[m],num[n])==t)
                            {
                                printf("%c%c%c%c%c\n",num[i]+64,num[j]+64,num[k]+64,num[m]+64,num[n]+64);
                                return ;
                            }
                        }
                    }
                }
            }
        }
        printf("no solution\n");
}
int main()
{
    int t;
    char s[30];
    while(~scanf("%d%s",&t,s))
    {
        if(t==0 && (!strcmp(s,"END")))
            break;
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            num[i]=s[i]-64;
        }
        sort(num,num+len,cmp);
        sovle(len,t);
    }
    return 0;
}


你可能感兴趣的:(HDU 1015 爆搜 /dfs+回溯)