一个环由个圈组成,把自然数1,2,…,N分别放在每一个圆内,数字的在两个相邻圈之和应该是一个素数。 注意:第一圈数应始终为1。
input: N(0~20)
output:输出格式如下所示的样品。每一行表示在环中的一系列圆号码从1开始顺时针和按逆时针方向。编号的顺序必须满足上述要求。打印解决方案的字典顺序。
源代码:
#include<stdio.h>
int a[20]={0},k=0,c,v,mark[20]={0},N;
int solution(int x,int y) //对是否为素数进行判断
{
c=x+y;
for(int i=2;i<c;i++)
{
v=c%i;
if(v==0) return 0;
}
return 1;
}
void print()
{
printf("顺时针方向:");
for(int j=0;j<N;j++)
{
printf("%d ",a[j]);
}
printf("逆时针方向:");
while(j>=0)
{
printf("%d ",a[j]);
j--;
}
printf("\n");
}
void dfs(int k)
{
if(k==N-1) //找到目标值则打印输出
{
print();
return;
}
for(int j=2;j<=N;j++)
{
if(solution(a[k],j)==1&&!mark[j]) //判断是否标记过,并且满足素数条件
{mark[j]=1; //标记已访问
a[k+1]=j; //赋值
dfs(k+1); //递归
mark[j]=0; //回溯
}
}
}
int main()
{a[0]=1;
scanf("%d",&N);
dfs(0);
return 0;
}