递归回溯

来源:互联网 发布:软件过程模型 编辑:程序博客网 时间:2024/04/30 10:19
#include <bits/stdc++.h>//nyoj_488using namespace std;const int N=30;int a[N],n,flag=1;int vis[N],isp[N];void init(){    memset(isp,0,sizeof(isp));    for(int i=2;i<N;i++)    {        if(!isp[i])for(int j=i+i;j<N;j+=i)              isp[j]=1;    }    return ;}void dfs(int cur){    if(cur==n&&isp[a[cur-1]+a[0]]==0)    {   flag=0;        for(int i=0;i<n;i++) printf("%d ",a[i]);printf("\n");    }    else    {      for(int i=2;i<=n;i++)      {          if(!vis[i]&&isp[i+a[cur-1]]==0)          {              vis[i]=1;              a[cur]=i;              dfs(cur+1);              vis[i]=0;          }      }    }    return ;}int main(){    int kase=1;    init();    while(scanf("%d",&n))    {        if(n==0) break;    printf("Case %d:\n",kase++);    if(n%2&&n>1) {printf("No Answer\n");continue;}    memset(vis,0,sizeof(vis));    flag=1;    a[0]=1;    dfs(1);    }    return 0;}

0 0