IT民工
加油!

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

素数环,回溯法

/*Accepted    1016    203MS    248K    1111 B    C++    Yu*/
#include<stdio.h>
#include<string.h>
int A[25], p[40], vis[25], n;

void isprime()
{
    int i, j;
    for(i = 2; i < 40; i ++)
        p[i] = 1;
    p[1] = 0;
    for(i = 2; i * i < 40; i ++)
    {
        if(p[i])
        {
            for(j = i + i; j < 40; j += i)
                p[j] = 0;
        }
    }
}

void dfs(int cur)
{
    int i;
    if(cur == n && p[A[0] + A[n - 1]])
    {
        for(i = 0; i < n - 1; i ++)
        {
            printf("%d ", A[i]);
        }
        printf("%d\n", A[n - 1]);
    }
    else
    {
        for(i = 2; i <= n; i ++)
        {
            if(!vis[i] && p[A[cur - 1] + i])
            {
                A[cur] = i;
                vis[i] = 1;
                dfs(cur + 1);
                vis[i] = 0;
            }
        }
    }
}

int main()
{
    int cas = 1;
    isprime();
    while(scanf("%d", &n) == 1)
    {
        printf("Case %d:\n", cas ++);
        memset(vis, 0, sizeof vis);
        memset(A, 0, sizeof A);
        A[0] = 1;
        dfs(1);
        printf("\n");
    }
    return 0;
}
posted on 2011-11-25 13:10  找回失去的  阅读(184)  评论(0)    收藏  举报