hdu 1015 Safecracker dfs()

来源:互联网 发布:远程桌面监控软件 编辑:程序博客网 时间:2024/04/28 21:25

此题恶心啊,20分钟的代码,硬是写了2个半小时,最后终于出来了,

题意:

你要得到一个序列 满足 一个关系式;

思路:

枚举排列,然后保存字典序最大的(就是这个恶心啊,,受不鸟,2,个小时啊,代码啊代码)

#include <stdio.h>#include <string.h>#include <iostream>using namespace std;int vis[1001];char str1[2001];int num[2001],sum[2001],n,m;int flag;int fun(int nm,int p)// 计算次方{    int su =  1;    while(p--)    {        su*=nm;    }    return su;}int num1[100001];void cmd()   // 模拟字典序比较( 就是此处恶心啊){    int flog = 0;    for(int i=1;i<=5;i++)    {        if(sum[i]>num1[i])         {             flog = 1;             break;         }         else         break;    }    if(flog)    {        for(int i=1;i<=5;i++)        num1[i] = sum[i];    }}void dfs(int count)    //  深搜 枚举数列{   if(count==6)   {       if(fun(sum[1],1) - fun(sum[2],2) + fun(sum[3],3) - fun(sum[4],4) + fun(sum[5],5)==n)       {         flag = 1;         cmd();       }       return ;   }   else   {       for(int i=1;i<=m;i++)       {          if(!vis[i])          {              sum[count] = num[i];   //此处勿忘              vis[i] = 1;              dfs(count+1);              vis[i] = 0;          }       }   }}int main(){    while(cin>>n,n)    {       cin>>str1;       m = strlen(str1);       flag = 0;       memset(num1,0,sizeof(num1));       memset(vis,0,sizeof(vis));       for(int i=0;str1[i];i++)       {           num[i+1] = str1[i]-'A'+1;         }       dfs(1);      if(flag==0)       puts("no solution") ;      else       {          for(int i=1;i<=5;i++)           printf("%c",num1[i]+'A'-1);           printf("\n");       }    }}


 

原创粉丝点击