UVA-542 Prime Ring Problem

来源:互联网 发布:戴着镣铐的舞蹈 知乎 编辑:程序博客网 时间:2024/06/16 12:08
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn = 1000;int prime[maxn];int A[maxn];int vis[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 n, int cur){//    for(int i = 1; i <= cur; i++)//        printf(i==1 ? "%d" : " %d", A[i]);//    printf("\n");    if(n < cur && prime[A[n]+1])//判断首尾和是素数    {        for(int i = 1; i <= n; i++)            printf(i==1 ? "%d" : " %d", A[i]);        printf("\n");        return;    }    else    {        for(int i = 2; i <= n; i++)        {            if(prime[A[cur-1]+i] && !vis[i])            //保证相邻的两个数是素数而且没有重复的数            {                vis[i] = 1;                A[cur] = i;                dfs(n, cur+1);                vis[i] = 0;                A[cur] = 0;            }        }    }}int main(){    int n;    for(int i = 2; i <= maxn; i++)        prime[i] = is_prime(i);//    for(int i = 0; i <= maxn; i++)//        cout << prime[i] << endl;    int t = 0;    while(scanf("%d", &n) == 1 && n)    {        memset(A, 0, sizeof(A));        memset(vis, 0, sizeof(vis));        if(t) printf("\n");        printf("Case %d:\n", t+1);        A[1] = 1;        dfs(n, 2);        t++;    }    return 0;}