这道题目暴力模拟会超时,另一种方法就是DFS,当n=20的时候虽然也会运行输出好长时间。这道题在提交的时候PE了好多次,输出格式一定要注意!!(有关Presentation Error错误原因的分析)
#include<bits/stdc++.h>
using namespace std;
int num[25];
int vis[25];
int prime[40];
int n;
void Init()
{
for(int i=1;i<40;i++)
{
if(i==1||i==2||i==3||i==5||
i==7||i==11||i==13||i==17||
i==19||i==23||i==29||i==31||
i==33||i==37)
prime[i]=1;
else prime[i]=0;
}
}
void DFS(int num[],int cnt,int vis[])
{
if(cnt==n&&prime[num[cnt]+1])
{
for(int i=1;i<=n;i++)
{
if(i!=n)
cout<<num[i]<<" ";
else
cout<<num[i]<<endl;
}
return;
}
else
{
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
if(prime[num[cnt]+i])
{
num[++cnt]=i;
vis[i]=1;
DFS(num,cnt,vis);
vis[i]=0;
cnt--;//回溯时标记位VIS恢复了,不要忘记下标也要恢复
}
}
}
}
}
int main()
{
int k=0;int cnt;
Init();
while(scanf("%d",&n)!=EOF)
{
k++;
cnt=0;
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis+1));
printf("Case %d:\n",k);
num[1]=1;cnt=1;vis[1]=0;
DFS(num,cnt,vis);
cout<<endl;
}
return 0;
}