題目描述
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
結果: