素数环(hdu 1016)

老早以前就遇到的一道题,那时候傻傻地用next_permutation()……dfs+剪枝


#include<bits/stdc++.h>
using namespace std;
const int prime[38]= {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1};
int vis[20],n,curr,p[20];
void dfs(int curr)
{
    if(curr==n&&prime[1+p[n-1]])
    {
        printf("1");
        for(int i=1;i<n;i++)
            printf(" %d",p[i]);
        printf("\n");
    }
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]&&prime[i+p[curr-1]])
        {
            p[curr]=i;
            vis[i]=1;
            dfs(curr+1);
            vis[i]=0;
        }
    }
}
int main()
{
    int kcase=0;
    while(scanf("%d",&n)==1)
    {
        printf("Case %d:\n",++kcase);
        memset(vis,0,sizeof(vis));
        p[0]=1;
        dfs(1);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/80201950
今日推荐