UVA 524 素数环(dfs回溯)
#include<bits/stdc++.h>
using namespace std;
int A[120];
bool isp[150];
int n;
int vis[150];
void dfs(int cur){
if(cur==n && isp[A[0]+A[n-1]]){
for(int i = 0;i < n;i++)
cout<<A[i]<<" ";
cout<<endl;
}else{
for(int i = 2;i <= n;i++){
if(!vis[i] && isp[i+A[cur-1]]){
A[cur] = i;
vis[i] = 1;
dfs(cur+1);
vis[i] = 0;
}
}
}
}
bool is_prime(int m){
for(int i = 2;i <= sqrt(m);i++){
if(m % i == 0)
return false;
}
return true;
}
int main()
{
while(cin>>n){
memset(vis,0,sizeof(vis));
memset(isp,false,sizeof(isp));
for(int i = 2;i <= 2*n;i++){
isp[i] = is_prime(i);
}
A[0] = 1;
dfs(1);
}
return 0;
}