素数环

问题描述

如图所示,一个环由n个圆组成。把自然数1,2,…,n分别放入每个圆中,两个相邻圆中的数之和应为素数。
注:第一个圆的数目应始终为1。
输入
n(0<n<20)

输出

输出格式如下所示。
每一行代表环中从1开始的一系列圈数。
数字顺序必须满足上述要求。按字典顺序打印解决方案。你要写一个程序来完成上述过程。
在每个案例后打印一个空行。

样本输入
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

# include <iostream>
# include <algorithm>
# include <cstring>
using namespace std;
int v[25];//做标记
int s[25];//存放
int p(int n)//素数筛选
{
	if(n<2)
 	return 0;
 	else{
 		for(int i=2;i*i<=n;i++)
   		if(n%i==0)
   		return 0;
   		return 1;
   	    }
}
void dfs(int num, int n){		//深搜
 	if(num==n&&p(s[n]+1)==1)	//相等时说明已经是完整序列
 					//并且保证第一个和末尾相加
 					//依然为素数

 	{
  		for(int i=1;i<n;i++)
  		cout<<s[i]<<" ";
  		cout<<s[n]<<endl;	//出口,为了格式最后一位后有空格
 	}
 	else
 	{
 	 	for(int i=2;i<=n;i++){
   		if(v[i]==0&&p(i+s[num])==1)	//没有出现过并且
   						//与前一项和为素数
   		{
    			v[i]=1;			//出现后标记
    			s[num+1]=i;		//符合条件存入数组
    			dfs(num+1,n);		//进入下一个		 					   
    			v[i]=0;		//消出标记,进行下一串。
   		}
 	}
  
 }
}
int main()
{
	int n,c=1;
 	while(cin>>n){
  	memset(v,0,sizeof(v));
  	memset(s,0,sizeof(s));
  	s[1]=1;
 	// v[1]=1;
  	printf("Case %d\n",c);
  	c++;
  	dfs(1,n);
  	printf("\n");
 	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值