题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1016
该题目的大概意思是:给定一个正整数n,在1~n这n个数中,按一定顺序组成一个圆环,要求圆环相邻两个数之和为素数,求出所有这样的组合并输出。
思路:开始想到循环列举判断,现在用DFS法
//Prime Ring Problem #include <iostream> #include<cmath> using namespace std; int prime[40]={ 0,1,1,1,0,1, 0,1,0,0,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,1,0,0};//手打素数表 int n; bool visit[25];//是否进行遍历的标志数组 int a[25]; //存储数字1~n void dfs(int num) { if(num==n && prime[a[0]+a[num-1]])//遍历所有数且相邻数之和为素数,则符合,输出 { for(int i=0;i<num;i++) { if(i!=num-1) cout<<a[i]<<" "; else cout<<a[i]<<endl; } } else { for(int i=2;i<=n;i++) { if(visit[i]==0)//若有未遍历的 { if(prime[i+a[num-1]])//若与已遍历的最后一个数之和为素数,符合要求 { visit[i]=1; a[num++]=i; //赋值 dfs(num); //遍历该分支 visit[i]=0; //恢复,等待下次循环遍历另一分支 num--; } } } } } int main() { int count=0; while(cin>>n) { count++; cout<<"Case "<<count<<":"<<endl; a[0]=1; dfs(1);//从根遍历 cout<<endl; } return 0; }
另外题中因为数据不多,素数表可手打,判断时也方便,也可用下面的函数代替:
2 bool IsPrime(int n) 3 { 4 for (int i = 2; i * i <= n; i++) 5 if(n % i == 0) 6 return false ; 7 return true ; 8 }
另附大神博客学习:http://blog.youkuaiyun.com/lishuhuakai/article/details/8014971