題意:很容易理解,就是讓你輸出滿足相鄰的相加是素數的序列(注意不要重復)
思路就是深搜思想把每種情況遍歷一次
代碼實現:
#include<stdio.h> #include<string.h> 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},n;//素數打表,因為n最大是20,所以只要打到40 int visited[21],a[21]; void dfs(int num)//深搜 { int i; if(num==n&&prime[a[num-1]+a[0]]) //滿足條件了,就輸出來 { for(i=0;i<num-1;i++) printf("%d ",a[i]); printf("%d\n",a[num-1]); } else { for(i=2;i<=n;i++) { if(visited[i]==0)//是否用過了 { if(prime[i+a[num-1]]) //是否和相鄰的加起來是素數 { visited[i]=-1;//標記了 a[num++]=i;//放進數組 dfs(num); //遞歸調用 visited[i]=0; //退去標記 num--; } } } } } int main() { int num=0; while(scanf("%d",&n)!=EOF) { num++; printf("Case %d:\n",num); memset(visited,0,sizeof(visited)); a[0]=1; dfs(1); printf("\n"); } return 0; }