初次接触回溯法,觉得真是很好用,可以减少很多不必要的枚举。
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; }
原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/44176553