hdu1015+hdu1016 都是十分钟以内的深搜题

hdu1015:给定一串可用序列值,每个字符映射到一个1-26之间的整数,选择五个有序数使得满足 a-b2+c3-d4+e5=target.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<map>
 6 using namespace std;
 7 int target;
 8 char s[15];
 9 int vis[28];
10 map<char,int>mp;
11 char ans[10],ch[10];
12 int num[10];
13 int len;
14 bool fin(int *a)
15 {
16     return a[0]-a[1]*a[1]+a[2]*a[2]*a[2]-a[3]*a[3]*a[3]*a[3]+a[4]*a[4]*a[4]*a[4]*a[4]==target;
17 }
18 void init()
19 {
20     memset(vis,0,sizeof(vis));
21     memset(ans,'\0',sizeof(ans));//空串字典序最小 
22     memset(ch,'\0',sizeof(ch));
23     memset(num,0,sizeof(num));
24     char c='A';
25     for(int i=1;i<=26;i++)
26     mp[c++]=i;         //构建映射关系 
27  } 
28  
29  void dfs(int cur)//当前处理的位数 
30  {
31      if(cur==5)
32      {
33          if(fin(num)&&strcmp(ch,ans)>0)
34          strcpy(ans,ch);
35          return;
36      }
37          for(int i=0;i<len;i++)
38          {
39              if(!vis[mp[s[i]]])
40              {
41                  vis[mp[s[i]]]=1;
42                  ch[cur]=s[i];//存储字符s[i]以便与ans比较 
43                  num[cur]=mp[s[i]];  //转化为数字,以便判断是否结束 
44                  dfs(cur+1);
45                  vis[mp[s[i]]]=0;
46              }
47         }
48         return;
49  }
50 int main()
51 {
52     
53     while(scanf("%d %s",&target,&s)==2&&!(target==0&&strcmp(s,"END")==0))
54     {
55         init();
56 //        cout<<"target:"<<target<<"   "<<s<<endl;
57          len=strlen(s);
58         sort(s,s+len);
59         dfs(0);
60         if(!strcmp(ans,""))cout<<"no solution"<<endl;
61         else cout<<ans<<endl;
62     }
63  } 

hdu1016 n个数的全排列构成圈使得相邻两数和为质数且第一个数是1。先预处理出40以内的质数,然后深搜。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
int a[21];
int isp[40];
int vis[25];
bool isprime(int x)
{
    if(x<2)return false;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
          return false;
    }
    return true;
}
   
void dfs(int cur)//搜索深度
{
    int i;
    if(cur==n&&isp[(a[cur-1]+a[0])])//递归结束条件 
    {
        for( i=0;i<n-1;i++)
        printf("%d ",a[i]);
        printf("%d\n",a[n-1]);
    }
    else for( i=2;i<=n;i++)
        {
             if(!vis[i]&&isp[i+a[cur-1]])
             {
                 a[cur]=i;
                 vis[i]=1;
                 dfs(cur+1);
                 vis[i]=0;       //状态回复 
             }
        }
} 

int main()
{ 
     for(int i=0;i<=40;i++)isp[i]=isprime(i);
    int t=1;
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        printf("Case %d:\n",t);
        a[0]=1;
        dfs(1);
        printf("\n");
        t++;
    }
 } 

 

posted @ 2020-02-29 18:39  WA自动机~  阅读(173)  评论(0编辑  收藏  举报