问题类型:DFS枚举+回溯。
问题链接、
03pie’s solution for [UVA-524]:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=16+1;
int vst[maxn];
int ans[maxn];
bool isp(int n){
for(int i=2;i<=(int)sqrt(n);i++)
if(n%i==0) return false;
return true;
}
void dfs(int n,int pos){
if(pos==n&&isp(ans[0]+ans[n-1])){
for(int i=0;i<n-1;i++)
cout<<ans[i]<<" ";
cout<<ans[n-1]<<endl;
}
else
for(int i=2;i<=n;i++)
if(!vst[i]&&isp(i+ans[pos-1])){
vst[i]=1;
ans[pos]=i;
dfs(n,pos+1);
vst[i]=0;
}
}
int main(){
int n,kase=0;
while(cin>>n){
if(kase)cout<<endl;
cout<<"Case "<<++kase<<":"<<endl;
memset(vst,0,sizeof(vst));
memset(ans,0,sizeof(ans));
ans[0]=1;
dfs(n,1);
}
return 0;
}