原题:
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
题意:
素数环问题,给一个n,将从1到n排成一个环,保证相邻的两个数的和为素数,永远将1放在第一个的位置上。
题解:
深搜,停止条件为cur==n,也就是搜索到最后一个,而且第一个数加最后一个数为素数,深搜步骤为找到一个没有用过的数与之前的加和为素数,然后继续深搜。
代码:AC
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
int vis[100];
int A[100];
int isprime(int sum)
{
int i;
for(i=2;i<sqrt(sum)+1;i++){
if(sum%i==0)
return 0;
}
return 1;
}
void dfs(int n,int cur)
{
int i;
if(cur==n&&isprime(A[0]+A[n-1]))
{
for(i=0;i<n-1;i++)
printf("%d ",A[i]);
printf("%d",A[i]);
printf("\n");
}
else
for(i=2;i<=n;i++)
{
if(!vis[i]&&isprime(i+A[cur-1]))
{
A[cur]=i;
vis[i]=1;
dfs(n,cur+1);
vis[i]=0;
}
}
}
int main()
{
int n,num=0;
while(cin>>n)
{
num++;
cout<<"Case "<<num<<":"<<endl;
memset(vis,0,sizeof(vis));
memset(A,0,sizeof(A));
A[0]=1;
dfs(n,1);
cout<<endl;
}
return 0;
}