Description:输入一个数n,求1~n这n个数字组成的环的不同种类数,环必须满足的条件:相邻两个数之和为素数
Sample Input 6 8 Sample Output Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
也是DFS模板题,代码如下:
#include"iostream" #include<cstdio> #include<cmath> #include<string.h> using namespace std; int n; int a[50]; int visit [50]; int isprime(int k) //判断素数 { int n=sqrt(double(k)); int i; for(i=2;i<=n;i++) if(k%i==0) return 0; return 1; } void dfs(int count) //深搜 { if(count==n&&isprime(a[n-1]+a[0])) { int i; for(i=0;i<n-1;i++) cout<<a[i]<<" "; cout<<a[i]<<endl; } else { int i; for(i=2;i<=n;i++) { if(!visit[i]&&isprime(i+a[count-1])) { a[count]=i; visit[i]=1; dfs(count+1); visit[i]=0; } } } } int main() { //freopen("a.txt","r",stdin); int ks=1; a[0]=1; while(cin>>n) { memset(visit,0,sizeof(visit)); cout<<"Case "<<ks++<<": "; dfs(1); cout<<endl; } return 0; }