版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leekerian/article/details/87100026
回溯记得标记的更新与返回
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int isp[1111]={0};
int n;
int num[111]={0};
int cont[111]={0};
void dfs(int k)
{
if(k==n)
{
if(!isp[num[0]+num[k-1]])
{
for(int i=0;i<n-1;i++)
cout<<num[i]<<" ";
cout<<num[n-1]<<endl;
}
return;
}
for(int i=1;i<=n;i++)
{
if(cont[i])
continue;
if(!isp[num[k-1]+i])
{
num[k]=i;
cont[i]=1;
dfs(k+1);
cont[i]=0;
num[k]=0;
}
}
}
int main()
{
isp[1]=1;
for(int i=2;i<1111;i++)
{
if(!isp[i])
{
int k=2;
for(int j=i*k;j<1111;j=i*k)
{
isp[j]=1;
k++;
}
}
}
int kase=1;
while(cin>>n)
{
memset(num,0,sizeof(num));
memset(cont,0,sizeof(cont));
cont[1]=1;
num[0]=1;
if(kase!=1) cout<<endl;
printf("Case %d:\n",kase++);
dfs(1);
}
return 0;
}