hdu1016

链接:点击打开链接

题意:给出一个n,用1~n围成一个环要求相邻的两个数和是素数,输出所有可能(以数字1为头)

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
int prime[1005],num[1005],temp[1005],vis[1005];
int n;
void dfs(int cur){
    int i;
    if(cur==n&&!prime[1+temp[n-1]]){        //个数到n并且收尾和也是素数输出
        for(i=0;i<n;i++){
            if(i!=n-1)
            printf("%d ",temp[i]);
            else
            printf("%d\n",temp[i]);
        }
    }
    for(i=2;i<=n;i++){
        if(!vis[i]&&!prime[i+temp[cur-1]]){
            temp[cur]=i;
            vis[i]=1;
            dfs(cur+1);
            vis[i]=0;
        }
    }
}
int main(){
    int i,j,k,cur;
    k=0;cur=1;
    memset(prime,0,sizeof(prime));
    for(i=2;i<1000;i++){
        if(!prime[i])
        num[k++]=i;
        for(j=0;j<k&&num[j]*i<1000;j++){
            prime[num[j]*i]=1;
            if(i%num[j]==0)
            break;
        }
    }                                       //素数筛
    while(scanf("%d",&n)!=EOF){
        printf("Case %d:\n",cur++);
        temp[0]=1;                          //第一位必须是1
        memset(vis,0,sizeof(vis));
        dfs(1);
        cout<<endl;
    }
    return 0;
}

你可能感兴趣的:(hdu1016)