输入n,把1,2,3…n 依次逆时针放入一个圆环中,使得相邻两个数和为素数。
Sample Input
6
8
Sample Output
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
生成从1开始的特殊全排列,依旧是深搜+回溯。注意输出格式!
#include <iostream>
#include<cstdio>
#include <cstring>
using namespace std;
int vis[50],a[50];
int cur;
int n;
int isp(int x)
{
for(int i=2; i*i<=x; i++)
if(x%i==0)
return 0;
return 1;
}
void dfs(int cur)
{
if(cur==n&&isp(a[0]+a[n-1]))//别忘了第一个数和最后一个数之和
{
for(int i=0; i<n-1; i++)
cout<<a[i]<<' ';
cout<<a[n-1];//注意输出格式,最后一个数没有空格
cout<<endl;
}
else
{
for(int j=2; j<=n; j++)
{
if(!vis[j]&&isp(j+a[cur-1]))//如果该点没有访问且该点与前一个数之和为素数
{
a[cur]=j;
vis[j]=1;
dfs(cur+1);
vis[j]=0;//回溯
}
}
}
}
int main()
{
int t=1;
while(cin>>n)
{
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
a[i]=i+1;
printf("Case %d:\n",t++);
dfs(1);
cout<<endl;
}
}