http://acm.hdu.edu.cn/showproblem.php?pid=1016
这道题是经典的素数环问题,相邻的两个数之和是素数。
解题方法:用的是深搜,以1为起点,搜索,下一个数为出去前面的数字的集合。(用vis数组记录访问过的节点)
剪枝:当前搜索值与数组前一个值之和不为素数的时候返回。
#include <iostream> #include <cstdio> #include <cstring> #include<math.h> using namespace std ; int n,m,flag; int a[1002],sum,vis[1002]; void dfs(int k); int panduan(int a); int main(){ int count=0; while(~scanf("%d",&n)){ count++; memset(vis, 0, sizeof(vis)); a[1]=1; printf("Case %d:\n",count); dfs(2); printf("\n"); } return 0; } void dfs(int k){ if(k==n+1){ if(panduan(a[n]+1)){ for(int i=1;i<n;i++){ printf("%d ",a[i]); } printf("%d\n",a[n]); } }else{ for(int i=2;i<=n;i++){ if(!vis[i]){ vis[i]=1; a[k]=i; if(panduan(a[k]+a[k-1])==1) dfs(k+1); vis[i]=0; } } } } int panduan(int a){ bool b=1; for(int i=2;i<=sqrt(a);i++){ if(a%i==0){ b=0; break; } } return b; }
时间: 2024-10-18 19:02:56