码迷,mamicode.com
首页 > 其他好文 > 详细

HDOJ1015(简单深搜)

时间:2015-07-30 16:52:25      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:

简单的深度优先搜索。求最大字典序,注意要先排序。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int SIZE=13;
char a[5];
int vis[SIZE*2+10];
bool cmp(char a,char b)
{
    return b > a;
}

int npow(int x,int n)
{
    int res=1;
    while(n)
    {
        if(n&1)    res*=x;
        x*=x;
        n>>=1;
    }
    
    return res;
}

bool check(long long target)
{
    long long ans=0;
    for(int i=0;i<5;i++)
    {
        if((i+1)%2==1)
            ans+=npow(a[i]-A+1,i+1);
        else
            ans-=npow(a[i]-A+1,i+1);
    }
    if(ans==target)
        return true;
    
    return false;
}

char out[6];
void dfs(int i,char op[],long long target)
{
    if(i==5)
    {
        if(check(target))
        {
            for(int j=0;j<5;j++)
                out[j]=a[j];
        }
        
        return ;
    }
    for(int j=0;op[j];j++)
    {
        int it=op[j]-A+1;
        if(!vis[it])
        {
            vis[it]=1;
            a[i]=op[j];
            dfs(i+1,op,target);
            vis[it]=0;
            a[i]=\0;            
        }            
    }
}
int main()
{
    
    long long target;
    char op[SIZE]={\0};
    while(scanf("%lld %s",&target,&op)!=EOF&&target!=0&&strcmp(op,"END")!=0)
    {
        sort(op,op+strlen(op),cmp);
        memset(out,\0,sizeof(out));
        memset(a,\0,sizeof(a));
        dfs(0,op,target);
        if(out[0]==\0)
            printf("no solution\n");
        else
            printf("%s\n",out);
        memset(op,\0,sizeof(op));
    }
    
    return 0;
}

 

HDOJ1015(简单深搜)

标签:

原文地址:http://www.cnblogs.com/program-ccc/p/4689515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!