***自己打印素数表
***另外一个很重要的思想就是:递归的时候,如果不能继续了, 就得把之前改变的状态变回来!
看了大神的代码,自己照葫芦画瓢。。。
#include <stdio.h>
#include <string.h>
int visited[21];//记录是否访问
int result[21];//记录结果
int T;//输入的值
int prime[40]//先自己打印素数表
={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0
,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};
int flag=0;
void dfs(int num)
{
if(num==T && prime[result[num]+1])
{
int i;
for(i=1;i<T;i++){
printf("%d ",result[i]);
}
printf("%d\n",result[T]);
}
int i;
for(i=2;i<=T;i++){
if(!visited[i]){
if(prime[i+result[num]]){
visited[i]=-1;
result[num+1]=i;
dfs(num+1);
visited[i]=0;
result[num+1]=0;
}
}
}
}
int main()
{
int N=1;
while(EOF!=scanf("%d",&T))
{
memset(visited,0,sizeof(visited));
result[1]=1;
printf("Case %d:\n",N);
dfs(1);
printf("\n");
N++;
}
return 0;
}