//目录

HDU(1016),打素数环

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

哈哈,状态来了就是不一样,很快就A了。

注意的位置是,最后一个点,要与第一个点比较。

#include <stdio.h>
#include <string.h>

int prime[50]= {0}; ///是素数就是0
bool vis[50];
int ans[25];
int n;

void dfs(int k)
{
    //printf("%d\n",k);
    if(k==n+1)
    {
        for(int i=1; i<n; i++)
            printf("%d ",ans[i]);
        printf("%d\n",ans[n]);
        return ;
    }
    else if(k==n)
    {
        for(int i=1; i<=n; i++)
        {
            if(!vis[i]&&!prime[ans[k-1]+i]&&!prime[i+ans[1]])
            {
                ans[k] = i;
                vis[i]=true;
                dfs(k+1);
                vis[i] = false;
            }
        }
    }
    else
    {
        for(int i=1; i<=n; i++)
        {
            if(!vis[i]&&!prime[ans[k-1]+i])
            {
                ans[k] = i;
                vis[i]=true;
                dfs(k+1);
                vis[i] = false;
            }
        }
    }
}

int main()
{
    ///打出40个素数来
    for(int i=2; i<8; i++)
        if(!prime[i])
            for(int j=i*i; j<50; j+=i)
                prime[j] = 1;

    /*for(int i=2; i<=45; i++)
    {
        if(!prime[i])
            printf("%d ",i);
    }
    puts("");*/

    int Case = 1;
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,false,sizeof(vis));
        memset(ans,0,sizeof(ans));
        printf("Case %d:\n",Case++);
        ans[1] = 1;
        vis[1] = true;
        dfs(2);
        puts("");
    }

    return 0;
}

 

posted @ 2016-07-27 21:00  小草的大树梦  阅读(243)  评论(0编辑  收藏  举报