素数圆环(dfs)

题目描述

如图所示为一个由n个圆圈构成的圆环。将自然数1,2,…,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?
注意:圆圈中的数字一定是从1开始的,并且连续不重复。
素数圆环(dfs)_第1张图片

输入描述:

输入包含多组测试数据。每组输入占一行,为整数n(0

输出描述:

对于每组输入,输出所有正确的方案,按字典序从小到大排序。每组输出后输出一个空行。具体输出格式见输出样例。

输入

6
8

输出

Case 1:
1 4 3 2 5 6
1 6 5 2 3 4

Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2

#include 
using namespace std;
bool is[1000],vis[25];
int n,cas=0;
int a[25];
int pos;

void sol(){
    is[0]=is[1]=true;
    for(int i=2;i<1000;i++){
        if(is[i]==true)continue;
        for(int j=2;i*j<1000;j++){
            is[i*j]=true;
        }
    }
}
void dfs(){
    if(pos==n){
        for(int i=1;i<=n;i++){
            if(i!=1)printf(" ");
            printf("%d",a[i]);
        }
        printf("\n");
        return;
    }
    for(int i=2;i<=n;i++){
        if(vis[i]==false){
            if(pos==n-1){
                if(!is[a[1]+i]&&!is[a[pos]+i]){
                    vis[i]=true;
                    pos++;
                    a[pos]=i;
                    dfs();
                    vis[i]=false;
                    pos--;
                }
            }
            else{
                if(!is[a[pos]+i]){
                    vis[i]=true;
                    pos++;
                    a[pos]=i;
                    dfs();
                    vis[i]=false;
                    pos--;
                }
            }
        }
    }
}
int main(){
    sol();
    while(~scanf("%d",&n)){
        printf("Case %d:\n",++cas);
        memset(vis,false,sizeof vis);
        a[1]=1;
        pos=1;
        vis[1]=true;
        dfs();
        printf("\n");
    }
}

你可能感兴趣的:(C++)