HDU-#1016 Prime Ring Problem(DFS+回溯)

来源:互联网 发布:java判断年份月份 编辑:程序博客网 时间:2024/05/30 23:50

题目大意:输入一个n,输出满足长度为n的素数环,该素数环满足相邻数之和为素数,由1~n组成。

解题思路:利用DFS进行每个位置的穷举,满足则继续下一个位置的搜索,否则则回溯。

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1016

code:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 21;int n,t,A[MAXN],vis[MAXN];bool isp[MAXN];int is_prime(int x) { //判断是否是素数  for(int i = 2; i*i <= x; i++)    if(x % i == 0) return 0;  return 1;}void DFS(int cur){ //利用DFS进行回溯    if(cur==n && isp[A[0]+A[n-1]]){//满足则输出,注意隐含条件第一个和最后一个数的和        for(int i=0;i<n-1;i++)            printf("%d ",A[i]);        printf("%d\n",A[n-1]);    }    else        for(int i=2;i<=n;i++) //测试每一个数i            if(!vis[i] && isp[i+A[cur-1]]){//未被访问且与前一个数的和为素数                A[cur]=i;                vis[i]=1; //访问则标记                DFS(cur+1);                vis[i]=0; //回溯则清除            }}int main() {    t=1;    while(scanf("%d", &n)!=EOF){        for(int i = 2; i <= n*2; i++) isp[i] = is_prime(i);//生成素数表,减少后续判断时间        memset(vis,0,sizeof(vis));        A[0] = 1;        printf("Case %d:\n",t++);        DFS(1);        printf("\n");    }  return 0;}


0 0
原创粉丝点击