初次接触回溯法,觉得真是很好用,可以减少很多不必要的枚举。
cur变量表示进行到的当前第cur+1个数。 作为A【】的下标出现。
#include<bits/stdc++.h>
using namespace std;
int n,vis[20],isp[100],A[30],maxn=0;
void dfs(int cur) {
if(cur==n&&isp[A[0]+A[n-1]]){
for(int i=0;i<n-1;i++) printf("%d ",A[i]);
printf("%d\n",A[n-1]);
}
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;
}
}
void isp_2() {
int i, j;
for(i = 2; i != 50; i++)
isp[i] = 1;
for(i = 2; i != 50; i++)
for(j = i + i; j < 50; j += i)
isp[j] = 0;
}
int main() {
isp_2();
while(scanf("%d",&n)!=EOF) {
memset(vis,0,sizeof(vis));
memset(A,0,sizeof(A));
A[0]=1;
if(maxn) printf("\n");
printf("Case %d:\n",++maxn);
dfs(1);
}
return 0;
}