重点在于我做了现场保护
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#define MAX 25
int height;
int list[MAX];
int visited[MAX];
int isPrimer(int n)
{
int i;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
void back(int level )
{
int i;
if(level>height)
{
return ;
}
//如果到最后一层的时候
if(level==height)
{
//判断是不是素数
if(isPrimer(list[level]+1))
{
for(i=1;i<level;i++)
{
cout<<list[i]<<" ";
}
cout<<list[level]<<endl;
}
}
//如果不是最后一行的话
//需要判断是不是活节点
for(i=1;i<=height;i++)
{
//如果这个节点没有被访问过
//那么加入到队列当中
if(!visited[i])
{
if(isPrimer(list[level]+i))
{
//把活节点加入,让后想下走
list[level+1]=i;
visited[i]=1;
back(level+1);
//保护现场,防止上一次的搜索影响下一次的搜索
list[level+1]=0;
visited[i]=0;
}
}
}
}
int main()
{
int i;
int times=0;
while(scanf("%d",&height)!=EOF)
{
//初始化
for(i=0;i<MAX;i++)
{
list[i]=0;visited[i]=0;
}
//预输出
printf("Case %d:\n",++times);
//开始处理
list[1]=1;
visited[1]=1;
back(1);
printf("\n");
}
return 0;
}