青藤 #10118 质数环

该博客讨论了如何找到大小为N(N<=17)的质数环,其中相邻数字之和为质数。博客提到了一种解决问题的方法,即通过打表来节省时间,并强调在检查环的首尾时需要注意特定条件。
摘要由CSDN通过智能技术生成
题目描述

一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数。如下图是一个大小为6的质数环。为了方便描述,规定数环上的第一个数字总是1。若两个质数环,数字排列顺序相同则视为本质相同。现在要求你求出所有本质不同的数环。

输入格式

只有一个数N,表示需求的质数环的大小。

输出格式

每一行描述一个数环,如果有多组解,按照字典序从小到大输出

有了数据范围,打表省时(isprime

#include <iostream>
using namespace std;
bool isprime[34] = { 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,
                     1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 },
     vis[20];
int Pc[20];
int n;
void Print() {
    for (int i = 1; i <= n; i++) cout << Pc[i] << ' ';
    cout << endl;
}
void Dfs(int d) {
    if (d == n + 1) {
        if (isprime[Pc[n] + Pc[1]] == 1)
            Print();
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (vis[i] == 0 && isprime[i + Pc[d - 1]] == 1) {
            vis[i] = 1, Pc[d] = i;
            Dfs(d + 1);
            vis[i] = 0;
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n;
    Pc[1] = 1, vis[1] = 1;
    Dfs(2);
}

最后环首环尾别忘了判断~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值