HDU 1016 Prime Ring Problem

来源:互联网 发布:练就不平凡软件 编辑:程序博客网 时间:2024/06/12 01:31
Problem : 1016 ( Prime Ring Problem )     Judge Status : Accepted

RunId : 4376328    Language : G++    Author : nasta

题意:

输入正整数n,把整数1~n组成换,是相邻两数之和均为素数。输出时从1开始逆时针排列。1<n<20

分析:

此题如果用枚举肯定超时,故可用DFS+剪枝+回溯。

网上看别人写得代码有用奇偶剪枝的,我自己试了下,对AC时间无影响、、、

#include <cstdio>#include <cmath>#define MAX    20int isp[MAX*2];int A[MAX], vis[MAX];int n;bool state = false;bool isPrime(int n){    if(n <= 1)        return false;    int t = (int)sqrt((float)n);    for(int i=2; i <= t; ++i)        if(n % i == 0)            return false;    return true;}void dfs(int cur){    if(cur == n && isp[A[0]+A[n-1]])    {        state = true;        for(int i=0; i < n; ++i)        {            if(i != 0)                printf(" ");            printf("%d", A[i]);        }        printf("\n");    }    else        for(int i=2; i<=n; ++i)        {            if(!vis[i] && isp[i+A[cur-1]])            {                A[cur] = i;                vis[i] = 1;                dfs(cur+1);                vis[i] = 0;            }        }}int main(){    for(int i=2; i < MAX*2; ++i)        isp[i] = isPrime(i);    int i=1;    A[0]=1;    while(scanf("%d", &n) != EOF)    {        state = false;        printf("Case %d:\n", i++);        dfs(1);        if(!state)            printf("\n");        printf("\n");    }    return 0;}

算法源自白书《算法竞赛:入门经典》

原创粉丝点击