hdu 1016 Prime Ring Problem -深搜初體驗

題目描述

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. 輸出的空格問題

  3. 題意不清楚

解題思路

首先要清楚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

結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章