UVA 524 素数环 【dfs/回溯法】

Description

A ring is composed of n (even number) circles as shown in diagram. Put natural numbers 1,2,3,...,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 <= 16)

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.

You are to write a program that completes above process.

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

【代码】:
/*素数环*/
#include <bits/stdc++.h>
using namespace std;
int n,prime[1005]={1},v[1005],a[1005];

void get_prime()
{
    int m=sqrt(2*n+0.5);//环-倍增
    memset(prime,1,sizeof(prime));//0为素数
    prime[0]=prime[1]=0;//非素数
    for(int i=2;i<=m;i++)
    {
        if(prime[i])//素数
        {
            for(int j=i+i;j<=2*n;j+=i)
            {
                prime[j]=0;//非素数
            }
        }
    }
}

void dfs(int cur)
{
    if(cur == n && prime[ a[0]+a[n-1] ])
    {
        for(int i=0; i<n; i++)
        {
             printf("%d%c", a[i], i == n - 1 ? ‘\n‘ : ‘ ‘);
        }
       // printf("\n");
    }
    else
    {
        for(int i=2; i<=n; i++)
        {
            if( !v[i] && prime[ i + a[cur-1] ] )
            {
                a[cur] = i;
                v[i]=1;
                dfs(cur+1);
                v[i]=0;
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    //初始化
    memset(v,0,sizeof(v));
    a[0]=1;

    get_prime();
    dfs(1);
}
时间: 2024-10-11 16:19:43

UVA 524 素数环 【dfs/回溯法】的相关文章

UVA - 524 Prime Ring Problem(dfs回溯法)

UVA - 524 Prime Ring Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers  into each circle separately, and the sum of number

uva 11218 KTV(DFS+回溯)

uva 11218 KTV One song is extremely popular recently, so you and your friends decided to sing it in KTV. The song has 3 characters, so exactly 3 people should sing together each time (yes, there are 3 microphones in the room). There are exactly 9 peo

HDU - 1010 (DFS回溯法 + 奇偶剪枝)

题目大意:给出一个N*M的迷宫,迷宫中有一扇门D,只有在T时刻会打开,现在你0时刻位于S,你需要在正好在T时刻到达D,你只能上下左右移动,每次移动耗费1时刻,且同一个位置不能进入两次,问是否能在T时刻刚好到达D处. 范围 1 < N,M < 7, 1 < T < 50,这个范围有点大,直接DFS回溯搜会TLE,我们要加上一个剪枝,这个剪枝十分重要,我们求出起点到终点的距离(横向距离 + 纵向距离),若这个距离为奇数,则时间T必须也要为奇数,否则时间T必须为偶数(其中的道理显而易见)

UVA - 524 Prime Ring Problem(dfs回溯法) 解题心得

原题 Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers  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.

UVa 129 Krypton Factor (DFS &amp;&amp; 回溯)

题意 : 如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的 串".例如,BB.ABCDACABCAB.ABCDABCD都是容易的串,而D.DC.ABDAB. CBABCBA都是困难的串.程序从输入中读取多行数据,每行包括两个整数n和L(即按此顺序给出),其中n > 0,L的范围是1 ≤ L ≤ 26.根据这些输入,程序要按照字母表升序打印出第n个"hard"字串(由字母表中的前L个字母构成),并在接下来的一行打

P1118 [USACO06FEB]数字三角形`Backward Digit Su`… 回溯法

有这么一个游戏: 写出一个11至NN的排列a_iai?,然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少11,直到只剩下一个数字位置.下面是一个例子: 3,1,2,43,1,2,4 4,3,64,3,6 7,97,9 1616 最后得到1616这样一个数字. 现在想要倒着玩这样一个游戏,如果知道NN,知道最后得到的数字的大小sumsum,请你求出最初序列a_iai?,为11至NN的一个排列.若答案有多种可能,则输出字典序最小的那一个. [

UVA - 524 Prime Ring Problem(素数环)(回溯法)

题意:输入n,把1~n组成个环,相邻两个数之和为素数. 分析:回溯法. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<s

UVa 524 Prime Ring Problem(DFS , 回溯)

题意  把1到n这n个数以1为首位围成一圈  输出所有满足任意相邻两数之和均为素数的所有排列 直接枚举排列看是否符合肯定会超时的  n最大为16  利用回溯法 边生成边判断  就要快很多了 #include<cstdio> using namespace std; const int N = 50; int p[N], vis[N], a[N], n; int isPrime(int k) { for(int i = 2; i * i <= k; ++i) if(k % i == 0)

素数环 南阳acm488(回溯法)

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