题目链接
基本思想
深度优先搜索结合回溯思想,这是很经典的样板题。
值得注意的是,这道题在输出格式上需要细心,还有筛素数可以用打表方式,此处筛素法用的是著名的Eratosthenes筛法(经典模板)。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
const int maxn=105;
int a[25];
int p[25];
int table[maxn];
void dfs(int cur){
for(int i=1;i<=n;i++){
if(!table[a[cur-1]+i] && !p[i]){
p[i]=1;
a[cur]=i;
if(cur==n){
if(!table[a[cur]+a[1]]){
if(a[1]==1){
for(int k=1;k<=n;k++){
cout<<a[k];
if(k!=n) cout<<' ';
}
cout<<endl;
}
}
}
else dfs(cur+1);
p[i]=0;
}
}
}
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int m=sqrt(maxn+0.5);
memset(table,0,sizeof(table));
for(int i=2;i<=m;i++)
if(!table[i])
for(int j=i*i;j<=maxn;j+=i) table[j]=1;
int t=0;
while(cin>>n){
if(t) cout<<endl; //注意这里的换行写在了输出数据的前面,为了避免最后多换一行
cout<<"Case "<<++t<<':'<<endl;
dfs(1);
}
return 0;
}
作者
Bowen
本文作者水平有限,若有纰漏之处,敬请斧正。
欢迎大家一起学习交流。