http://acm.hdu.edu.cn/showproblem.php?pid=1016

经典问题,素数环。

直接回溯即可。

View Code
#include <stdio.h>
#include <string.h>
int n;
int a[30];
int prime[100],vis[30];
void dfs(int cur)
{
    if(cur==n && prime[a[0]+a[n-1]]==0)
    {
        printf("%d",a[0]);
        for(int i=1;i<n;i++)
            printf(" %d",a[i]);
        putchar('\n');
    }
    else
        for(int i=2;i<=n;i++)
            if(!vis[i] && prime[i+a[cur-1]]==0)
            {
                a[cur]=i;
                vis[i]=1;
                dfs(cur+1);
                vis[i]=0;
            }
}
int main()
{
    int nCase=1;
    for(int i=2;i*i<101;i++)
        if(!prime[i])
            for(int j=i;j*i<101;j++)
                prime[j*i]=1;
    while(~scanf("%d",&n))
    {
        printf("Case %d:\n",nCase++);
        a[0]=1;
        memset(vis,0,sizeof(vis));
        dfs(1);
        putchar('\n');
    }
    return 0;
}