请问素数环为什么这样的代码会超时

#include
#include
using namespace std;
int step[21]={1};
int flag[21]={0};
int a[42]={0};
int n;

void dfs(int dp)
{
int i;
for(i=2;i<=dp;i++)
{
if(!a[step[i-1]+step[i-2]])
return;
}

if(dp==n)
{
    if(a[1+step[n-1]])//首尾 
    {
        printf("1");
        for(i=1;i<n;i++)
        printf(" %d",step[i]);
        printf("\n");
    }
    return;
 }
 for(i=2;i<=n;i++)
 {
     if(flag[i]==0)
     {
         step[dp]=i;
         flag[i]=1;
         dfs(dp+1);
         flag[i]=0;
     }
    }
 }

int main()
{
int cnt=1;

 a[2]=a[3]=a[5]=a[7]=a[11]=a[13]=a[17]=1;
 a[19]=a[23]=a[29]=a[31]=a[37]=a[41]=1;

 while(scanf("%d",&n))
 {
     printf("Case %d:\n",cnt);
    if(n==1) printf("1\n");  
    if(n%2==0)
    {
        dfs(1);
    }
    cnt++;
    printf("\n");

}
return 0;}

https://blog.csdn.net/iteye_20025/article/details/82123695