题目描述
*A ring is compose of n circles as shown in diagram. Put naturalnumber 1, 2, …, n into each circle separately, and the sum of numbers in twoadjacent circles should be a prime.
Note: the number offirst circle should always be 1.
如图所示,环由n个圆组成。将自然数1,2,…,n分别放入每个圆圈中,并且相邻两个圆圈中的数字总和应为素数。
注意:第一个圆圈的数量应该始终为1*
题目链接为:http://acm.hdu.edu.cn/showproblem.php?pid=1016
考核知识点
深搜+素数
常见误区
在每个案例后打印一个空行(是奇数也要打空行)。
输出的空格问题
题意不清楚
解题思路
首先要清楚1.这是个深搜问题2应该分成三类(1和偶数和除1以外的所有奇数)讨论3.有两个函数(一个判断是不是素数一个用来输出结果)4.深搜的出口和常规代码
#include <stdio.h>
#include <string.h>
#include <math.h>
#include<algorithm>
int n,a[25],b[25];
bool prime(int n)//判断该数是否是 素数
{
int i;
if(n<2) //小于2的都不是素数 返回false
return false;
else
{
for(i=2;i<=sqrt(n);i++)//从二开始 到该数开平方
if(n%i==0)//如果可以被从二开始 到该数开平方整数,就跳出循环
break;
if(i>sqrt(n))//判断是否是正常结束,如果是正常 返回true
return true;
else //不是正常结束,返回flase
return false;
}
}
void print(int a[],int n) //输出结果
{
int i;
for(i=1;i<=n;i++)
{
printf("%d",a[i]); //输出素数
if(i!=n) //如果该数不是范围内最后一个素数 输出一个空格
printf(" ");
else //如果该数不是范围内最后一个素数 输出一个换行
printf("\n");
}
}
void dfs(int s)
{
int i;
if(s==n+1) //表示进行到最后一个数
{
if(prime(a[n]+a[1])) //判断最后一个跟第一个的和是不是素数
print(a,n); //输出结果
return ;
}
for(i=2;i<=n;i++) //每一次都是从2开始 到n
if(prime(a[s-1]+i)&&b[i]==0) //判断 这个数和前一个数的和是不是素数并且这个数出现过没
{ // 这个数和前一个数的和是素数并且这个数没出现过
a[s]=i; //令第【s】个数为 i
b[i]=1; //标记为1 表示出现过
dfs(s+1); //递归
b[i]=0; //这条路走死了, 让这个数标记为0 表示没出现过进行下次递归
}
}
int main()
{
int t=0;
while(scanf("%d",&n)!=EOF)
{
memset(b,0,sizeof(b));//初始化为0 表示都没有出现
t++;
printf("Case %d:\n",t);
if(n==1)
printf("1\n");//如果是1的话 直接输出1
else if(n%2!=0)
continue; //如果是1以外的奇数,那么肯定会有两个奇数连在一起,不符合要求
else
{
a[1]=1; //令它从1开始
b[1]=1; //标记 1的话已经出现
dfs(2); // 2表示第2个数
}
printf("\n");
}
return 0;
}
示例:
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
结果: