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++; } }
原文:https://www.cnblogs.com/randy-lo/p/12384629.html