HDU 1016- Prime Ring Problem (深度优先搜索)

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.

Input

n (0 < n < 20).

Output

The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.

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

题意:

       使1~n的数以1为开头形成一个素数环,即相邻两个数之和为素数。

思路:

      把40之内的素数打表,深搜,判断末尾数与第一个数之和是否为素数,判断相邻两数之和是否为素数即可。

     PE了一次,发现是输出后多了一个空格,不说了都是泪。

代码:

#include<stdio.h>
#include<string.h>
int prime[40]= {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1};
int n;
int book[21],a[21];
void dfs(int m)
{
	int i;
	if(m==n&&prime[a[0]+a[m-1]])
	{
		for(i=0;i<m-1;i++)
			printf("%d ",a[i]);
		printf("%d\n",a[m-1]);
		return;
	}
	for(i=2;i<=n;i++)
	{
		if(book[i]==0)
		{
			if(prime[i+a[m-1]])
			{
				book[i]=1;
				a[m++]=i;//存入数组
				dfs(m);
				book[i]=0;
				m--;
			}
		}
		
	}
}
int main()
{
	int i,c=0;
	while(~scanf("%d",&n))
	{
		c++;
		printf("Case %d:\n");
		a[0]=1;
		dfs(1);
		printf("\n");
	}
}

猜你喜欢

转载自blog.csdn.net/wan_ide/article/details/81082875