Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 34799 Accepted Submission(s): 15411
1 #include <iostream> 2 using namespace std; 3 int a[30]= {0,1},b[30],sushu[50],n; //a表示素数环中的数字,b用来标记,sushu标记是否是素数 4 void DFS(int s,int k) //s代表当前循环到第几个数,k标记此时是否是第一次进人深搜函数 5 { 6 int i,j; 7 if(s>n) 8 { 9 if(sushu[a[1]+a[n]]) //最后一个数字和第一个数字的和 10 { 11 for(i=1; i<=n; i++) //全部满足,输出这组数据的全部数 12 { 13 if(i>1) cout<<" "; 14 cout<<a[i]; 15 } 16 cout<<endl; 17 } 18 else return; //若最后一组数据不满足,则返回上一次循环 19 } 20 for(i=2; i<=n; i++) 21 { 22 if(k) 23 for(j=1; j<30; j++) //第一次进来,所有的数字都可以使用 24 b[j]=1; 25 if(sushu[i+a[s-1]]&&b[i]) //i表示当前数字,a[s-1]表示上一个数字。两个数字之和为素数,且没有出现过i这个数字 26 { 27 a[s]=i; //s位置上的数字记录为i 28 b[i]=0; //0表示为已使用 29 DFS(s+1,0); //一个满足条件,进入下一个数字的选择 30 b[i]=1; //若返回上一层循环,标记已使用了的数字必须还原为未使用 31 } 32 } 33 } 34 int main() 35 { 36 int i,j,t=1; 37 for(i=0; i<50; i++) 38 sushu[i]=1; 39 sushu[0]=sushu[1]=0; 40 for(i=2; i<=25; i++) 41 if(sushu[i]) 42 for(j=i+i; j<50; j+=i) 43 sushu[j]=0; //素数打表,减少代码运行时间,素数为1,非素数为0 44 while(cin>>n) 45 { 46 cout<<"Case "<<t++<<":"<<endl; 47 DFS(2,1); 48 cout<<endl; 49 } 50 return 0; 51 }
hdu 1016 Prime Ring Problem(dfs)
原文:http://www.cnblogs.com/pshw/p/4776440.html