Bootstrap

深搜专题3:素数圈

描述 正整数n表示有n个数,分别是正整数1~n,然后把这n个数组成一个圈,使得相邻两个整数之和均为素数。输出时,从整数1开始逆时针排列。同一个圈应恰好输出一次。n < = 16

输入描述 输入整数n。

输出描述 按要求输出。

用例输入

6

用例输出

1 4 3 2 5 6 
1 6 5 2 3 4

具体思路:

1 2 3 4 5(4+5=9,不行,回退)

1 2 3 5(3+5=8,不行,回退)

1 2 3 6(3+6=9,不行,回退)

1 2 4(2+4=6,不行,回退)

1 2 5 3(5+3=8,不行,回退)

1 2 5 4(5+4=9,不行,回退)

1 2 5 6 3(6+3=9,不行,回退)

1 2 5 6 4(6+4=10,不行,回退)

1 2 6(2+6=8,不行,回退)

1 3(1+3=4,不行,回退)

1 4 2(4+2=6,不行,回退)

1 4 3 2 5 6 得解。

代码:

#include <bits/stdc++.h>
using namespace std;
int n,sum;
int s[20];
int vis[20];
bool ss(long long e){//判断素数
    if(e < 2)return false;
    for(int i=2;i<=e/i;i++){
        if(e%i==0)return false;
    }
    return true;
}
void dfs(int len){
    if(len==n+1){
        if(!ss(s[1]+s[n]))return;//只需判断头加尾是否是素数即可
        for(int i=1;i<=n;i++){
            cout<<s[i]<<" ";
        }
        cout<<endl;
        return;
    }
    for(int i=2;i<=n;i++){
        if(!vis[i]&&ss(s[len-1]+i)){//这里判断相邻位置是否符合条件
            vis[i]=1;
            s[len]=i;
            dfs(len+1);
            vis[i]=0;
        }
    }
}
int main(){
    cin>>n;
    s[1]=1;
    dfs(2);//因为1已经固定了,所以起点从2开始
    return 0;
}

;