杭电1015

来源:互联网 发布:linux epoll和read 编辑:程序博客网 时间:2024/06/06 07:17

既然大家来看这篇博客,想必1015这题的题意大家都知道的,直接上代码吧
代码的注释也比较详细,,应该没问题的,主要是细心

#include"iostream"#include"stdio.h"#include"math.h"#include"string.h"#include"algorithm"using namespace std;int n,a[5],book[20],flag,mm[20];double goal,c;char m[20],aa[5];void dfs(int step){    int i;    if(flag)//若已找到,直接退出        return;    if(step==5)//当有五个数时进行检查    {        c=a[0]-pow(a[1],2)+pow(a[2],3)-pow(a[3],4)+pow(a[4],5);        if(c==goal)        {            flag=1;            for(i=0; i<5; i++)                aa[i]=a[i]+64;//将数字还原成对应的字母            printf("%s\n",aa);            return;        }    }    for(i=n-1; i>=0; i--)//倒着找    {        if(book[i]==0&&step<=4)//book[]数组是用来记录这个数有没有访问过,step<=4保证只需要对前面五个数进行排列        {//剩下的就是常规的深搜了            a[step]=mm[i];            book[i]=1;            dfs(step+1);            book[i]=0;        }    }}int main(){    int i;    while(scanf("%lf",&goal)==1)//goal也就是目标值    {        memset(book,0,sizeof(book));        flag=0;        getchar();        cin>>m;//密码来源        if(goal==0&&strcmp(m,"END")==0)            break;        n=strlen(m);//来源的个数        sort(m,m+n);//排序      printf("no solution\n");    }}
原创粉丝点击