素数环

                                            488-素数环


题目描述:

有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。

输入描述:

有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。

输出描述:

每组第一行输出对应的Case序号,从1开始。
如果存在满足题意叙述的素数环,从小到大输出。
否则输出No Answer。

样例输入:

6
8
3
0

样例输出:

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
Case 3:
No Answer

分析:

1、数据初始化; 
2、递归填数:判断第i个数填入是否合法; 
A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个; 
B、如果不合法:选择下一种可能;

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int flag[30],book[30];  //book数组存放素数环顺序 
int prime(int n)   //检查素数 
{
	int k=sqrt(n);
	for(int i=2;i<=k;i++)
		if(n%i==0)return 0;
	return 1;
} 
void dfs(int n,int p)  //p代表数字存放在book数组中的位置 
{
	for(int i=2;i<=n;i++)
		if(prime(book[p-1]+i)==1 && flag[i]==0)
		{
			book[p]=i;  //存放数据 
			flag[i]=1;  //做标记,数字被存放之后,不能第二次访问 
			if(p==n && prime(book[1]+book[n])==1)  //素数环形成,输出 
			{
				for(int i=1;i<n;i++)
					printf("%d ",book[i]);
				cout<<book[n]<<endl;
			}
			else dfs(n,p+1); 
			flag[i]=0;  //回溯,将标记去除 
		}
}
int main()
{
	int n,ans=1;
	while(cin>>n,n)
	{
		cout<<"Case "<<ans++<<':'<<endl;
		memset(flag,0,sizeof(flag));
		memset(book,0,sizeof(book));
		book[1]=1;
		if(n==1)  //特判 
			cout<<n<<endl; 
		else if(n%2==1) //奇数不能构成素数环 
			cout<<"No Answer"<<endl;
		else dfs(n,2);  //book[1]已经放入1,所以从2开始 
	}
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[2\]的代码,这是一个解决"素数"问题的算法。该问题要找到一个由1到n这些数组成,使得相邻两个数之和都是素数。算法使用了深度优先搜索的思想,先选定一个数,然后递归地选择下一个数,直到找到一个满足条件的。在递归过程中,使用了一个数组来记录已经选择的数,以及一个布尔数组来标记是否已经访问过某个数。同时,还使用了一个函数来判断一个数是否是素数。 根据引用\[3\]的输出示例,当n=4时,可能的素数有8个,分别是: 1: 1 2 3 4 2: 1 4 3 2 3: 2 1 4 3 4: 2 3 4 1 5: 3 2 1 4 6: 3 4 1 2 7: 4 1 2 3 8: 4 3 2 1 因此,对于问题"1358 - 素数",当n=4时,总共有8个满足条件的素数。 #### 引用[.reference_title] - *1* [【DFS练习】素数](https://blog.csdn.net/z135733/article/details/122742948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [1358 - 【提高】素数](https://blog.csdn.net/PanDaoxi2020/article/details/126597717)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值