经过了太多曲折终于做出来了
回溯法中的递归判断条件和变量要仔细考虑
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 50
int n,A[max]={1},B[max]={1},flag[max];//A为输出数组,B为判断素数数组,C为标志变量数组
void dfs(int i)
{
int k,j;//注意每一次都会重新定义不要弄成全局变量
if(i==n&&B[A[0]+A[n-1]])//这是最后一步同时清楚上界
{
for(k=0;k<n;k++) k ? printf(" %d",A[k]):printf("%d",A[k]);
printf("\n");
}
else for(j=2;j<=n;j++)//1已经判断好了所以直接从2开始
{
if(!flag[j]&&B[j+A[i-1]])//标志数组:若此数字已排序则进入下一次循环//判断此数字和输出数组上一个的和是否为素数
{
flag[j]=1;//标记此数字
A[i]=j;//进行排序
dfs(i+1);//递归
flag[j]=0;//跳到总循环这样才可以重新开始所以需注意
}
}
}
int isprime(int l)//判断是否为素数
{
int k;
for(k=2;k<l/2;k++)
{
if(l%k==0) return 0;
}
return 1;
}
int main()
{
int num=0;
int l;
for(l=2;l<=max;l++)
{
B[l]=1;
}
for(l=2;l<=max;l++)
{
if(!isprime(l))//对素数进行0-1规划,便于判断
B[l]=0;
}
while(scanf("%d",&n)!=EOF)
{
if(num++)
printf("\n");
printf("Case %d:\n",num);
dfs(1);
}
return 0;
}