ACM之素数环(DFS)
#include<stdio.h> #include<iostream> using namespace std; #include<stdlib.h> int visit[30];//visit为标记数组 int a[30]; int n; int count; /*判断是否为素数*/ int su(int x) { int i; for(i=2; i*i<=x; i++) if(x%i==0) return 0; return 1; } //深搜 void dfs(int x,int y) { if(y==n+1) { if(su(x+1)==1) { count++; for(int i=1;i<=n;i++) printf("%d ",a[i]); printf("\n"); } } for(int i=2; i<=n; i++) { if(visit[i]==0&&su(x+i)==1) //x与其他没有遍历过的点进行比较判断 { visit[i]=1;//标记 a[y]=i; dfs(i,y+1); //递归 visit[i]=0;//恢复现场 } } } int main() { while(~scanf("%d",&n)) { count=0; a[1]=1; visit[1]=1; dfs(1,2); cout<<count<<endl; } return 0; }