Advertisement

UVa 524素数环

阅读量:

给定一个正整数n,将数字1、2、3、……、n排列成一个环状结构,要求任意两个相邻数字之和为素数。输出时需按照逆时针方向从1开始排列,且每个符合条件的环仅输出一次。

样例输入:
6
样例输出:
1 4 3 2 5 6
1 6 5 2 3 4

由于输入的n最大不超过16,因此相邻两数之和的最大值不会超过16 + 15 = 31。为此,可预先构建一个素数数组,以减少重复判断素数所耗费的时间。

为了确保每个数字在环中仅出现一次,设置一个vis数组用于记录已使用的数字。由于该问题需要通过回溯法进行求解,在递归调用结束后需将对应位置的标记恢复为初始状态。

一旦发现当前路径不满足条件,则立即终止当前分支的搜索过程,并返回上一层继续尝试其他可能性。

复制代码
    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    bool Prime[100];
    bool vis[50];
    int n;
    
    bool isPrime(int n) {
    if(n == 1) return false;
    for(int i = 2; i * i <= n; i++) {
        if(n % i == 0)

全部评论 (0)

还没有任何评论哟~