HDU解题报告——1016

来源:互联网 发布:linux wpa supplicant 编辑:程序博客网 时间:2024/05/16 08:50

  这一题在没学DFS之前想到的方法是用STL里的permutation枚举求解,但是复杂度为(n-1)(n-1)!,实在伤不起,直接DFS就行了,也不用考虑栈溢出,代码如下:

#include <iostream>using namespace std;int prime[11]={3,5,7,11,13,17,19,23,29,31,37};int n,num[20];bool mark[20];bool jp(int a){for(int i=0;a>=prime[i];i++)if(a==prime[i]) return true;return false;}void print(){for(int i=1;i<n;i++) cout<<num[i]<<" ";cout<<num[n]<<endl;}void dfs(int total){if(total>n){if(jp(num[n]+num[1])) print();}else{for(int i=2;i<=n;i++){if(mark[i]) continue;else if(!jp(i+num[total-1])) continue;else{mark[i]=true;num[total]=i;dfs(total+1);mark[i]=false;}}}}int main(){for(int c=1;cin>>n;c++){memset(mark,false,sizeof(mark));cout<<"Case "<<c<<":\n";num[1]=1;mark[1]=mark;dfs(2);cout<<endl;}return 0;}


 

0 0
原创粉丝点击