例题7-4 素数环 UVa524

1.题目描述:点击打开链接

2.解题思路:本题利用回溯法解决。首先生成2*n范围内的所有素数,便于后续的判断。接下来试着填写每一位,如果数字i满足没有用过且它与前一项之和是素数,那么就可以用它,同时标记它已使用,递归寻找cur+1,退出时清除使用标记。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define N 20
int vis[2*N],A[N],flag[N];
int n;

void init()//生成素数
{
	int m = sqrt(2*N + 0.5);
	for (int i = 2; i <= m;i++)
	for (int j = i*i; j < 2 * N; j += i)
	if (!vis[j])
		vis[j] = 1;
}
void dfs(int cur)
{
	if (cur == n&&!vis[A[0] + A[n - 1]])
	{
		for (int i = 0; i < n; i++)
			printf("%d%c", A[i], i == n - 1 ? '\n' : ' ');
	}
	else for (int i = 2; i <= n;i++)
	if (!flag[i] && !vis[i + A[cur - 1]])
	{
		A[cur] = i;
		flag[i] = 1;//设置使用标志
		dfs(cur + 1);
		flag[i] = 0;//清除使用标志
	}
}
int main()
{
	//freopen("t.txt", "r", stdin);
	int rnd = 0;
	init();
	while (~scanf("%d", &n))
	{
		if (rnd)cout << endl;
		printf("Case %d:\n", ++rnd);
		memset(A, 0, sizeof(A));
		A[0] = 1;
		memset(flag, 0, sizeof(flag));
		dfs(1);
	}
	return 0;
}
时间: 2024-08-06 03:41:56

例题7-4 素数环 UVa524的相关文章

NYOJ-488 素数环

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

素数环

问题描述: 将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. n=20时,下面的序列就是一个素数环: 1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 20 11 12 19 18 php版本回溯算法: 1 <?php 2 //素数环问题 3 include "show.php"; 4 5 define("LEN", 20); 6 7 class Primes 8 { 9 privat

回溯算法之素数环

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// <ather> /// lihonglin /// </ather> /// <content> /// 把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数. ///分析:用回溯算法,考察所有

HDU-1016【素数环】

题意:本题题意就是构成一个素数环.即相邻两数之和要为素数.环的元素个数在1到20之间. 素数-只能被1和它本身整除的数 输入6就是1-6排成一个相邻数相加是素数:环,第一个和最后一个加起来也要是素数 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 /*su shu huan*/

nyist 488 素数环

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

Prime Ring Problem 经典素数环

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.

nyoj 488素数环

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始.如果存在满足题意叙述的素数环,从小到大输出.否则输出No Answer. 样例输入 6 8 3 0 样例输

ACM:回溯法,八皇后问题,素数环

(一)八皇后问题 (1)回溯法 #include <iostream> #include <string> #define MAXN 100 using namespace std; int tot = 0, n = 8; int C[MAXN]; void search(int cur) { if(cur == n) ++tot; //递归边界,只要走到了这里,所有皇后必然不冲突 else for(int i = 0; i < n; ++i) { int ok = 1; C

nyoj素数环(dfs)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样