素数圆环-dfs

题目描述

如图所示为一个由n个圆圈构成的圆环。将自然数1,2,…,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?

注意:圆圈中的数字一定是从1开始的,并且连续不重复。

《素数圆环-dfs》

输入格式

输入包含多组测试数据。每组输入占一行,为整数n(0<n<20),表示圆圈数。

输出

对于每组输入,输出所有正确的方案,按字典序从小到大排序。每组输出后输出一个空行。具体输出格式见输出样例。
注意:只能按照顺时针方向放置数字。

样例输入

6
8

样例输出

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的全排列,然后再用一个循环判断是不是满足条件就可以了。

下面是代码:

#include <stdio.h>
#include <string.h>
int n,a[21],book[21];

bool prime(int num)//判断是不是素数 
{
	int T,D;
	if(num%2==0)
		return false;
	D=3;
	T=num;
	while(T>D)
	{
		if(num%D==0)
		return false;
		T=num/D;
		D+=2;
	}
	return true;
}
void dfs(int step)//深搜1到n的全排列。 
{
	int i;
	if(step == n+1)
	{
		a[n+1]=a[1];
		if(a[1]!=1)
		return ;
		for(i=1;i<=n;i++)
		{
			if(prime(a[i]+a[i+1])==0)//来判断条件不是不是满足 
				return ;
		}
		for(i=1; i<=n; i++)
			printf("%d%c", a[i],i==n?'\n':' ');//输出满足条件的序列 
	}
	for(i=1; i<= n; i++)//深搜的核心代码。 
	{
		if(book[i]==0)
		{
			a[step]=i;
			book[i]=1;
			dfs(step+1);
			book[i]=0;
		}
	}
	return ;
}

int main() 
{
	int count;
	count=0;
	while(~scanf("%d", &n))
	{
		memset(book,0,sizeof(book));
		count++;
		printf("Case %d:\n",count);
		dfs(1);
	}
}


    原文作者:DFS
    原文地址: https://blog.csdn.net/qq_32863631/article/details/70662024
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞