[NWPU2016][寒假作业][正常版第三组]I
素数环,简单的dfs,但这道题我有个小地方写错了半天发现不了。。就是flag数组的位置。一定要放在if里面,刚开始没注意,一不小心写到外面了。
#include <iostream> #include <algorithm> #include <cstdio> #include <map> #include <string> #include <string.h> #include <queue> #include <vector> #include <set> #include <cmath> #define inf 0x7fffffff #define N 10000 using namespace std; int n,h,a[10000],flag[10000]; bool prime[N]; void isprime(){ int i,j; for(i=2; i<N; i++) if(i%2) prime[i]=true; else prime[i]=false; for(i=3; i<=sqrt(N); i++) { if(prime[i]) for(j=i+i; j<N; j+=i) prime[j]=false; } prime[2]=true; } void dfs(int m) { if(m==n+1) { for(int j=1;j<n;j++) printf("%d ",a[j]); printf("%d\n",a[n]); } else { for(int i=2;i<=n;i++) { if((!flag[i]&&prime[i+a[m-1]]&&m!=n)||(!flag[i]&&m==n&&prime[i+a[m-1]]&&prime[i+a[1]])) { a[m]=i; flag[i]=1; dfs(m+1); flag[i]=0; } } } } int main() { isprime(); while(scanf("%d",&n)!=EOF) { a[1]=1; memset(flag,0,sizeof(flag)); printf("Case %d:\n",++h); dfs(2); printf("\n"); } return 0; }