2841: 【图论】素数环

2841: 【图论】素数环如图所示为一个由 n 个圆圈构成的圆环

题目描述

如图所示为一个由n个圆圈构成的圆环。将自然数1,2,...,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?

注意:圆圈中的数字一定是从1开始的,并且连续不重复。

输入

一行,为整数n(1<n<20),表示圆圈数。

输出

输出所有正确的方案,按字典序从小到大排序。每组输出后输出一个换行。具体输出格式见输出样例。
注意:只能按照顺时针方向放置数字。如果无解,输出-1

样例输入

6

样例输出

1 4 3 2 5 6
1 6 5 2 3 4

Code:

#include<bits/stdc++.h>
using namespace std;
int n,tot,ans[21];
bool vis[21];
bool G[21][21];
bool isprime(int n){
    if(n==1){
        return false;
    }else if(n==2){
        return false;
    }
    for(int i=2;i<n;i++){
        if(n%i==0)
        return false;
    }
    return true;
}
void print(){
    tot++;
    for(int i=1;i<=n;i++){
        cout<<ans[i]<<" ";
    }
    cout<<endl;
}
void dfs(int st){
    if(st==n+1){
        if(G[ans[n]][1]){
            print();
        }
        return;
    }
    for(int i=2;i<=n;i++){
        if(vis[i]==0&&G[ans[st-1]][i]){
            ans[st]=i;
            vis[i]=true;
            dfs(st+1);
            vis[i]=false;
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            G[i][j]=G[j][i]=isprime(i+j);
        }
    }
    ans[1]=1;
    vis[1]=true;
    dfs(2);
    if(tot==0){
        cout<<-1<<endl;
    }
    return 0;
}
/**************************************************************
    Problem: 2841
    User: yangrenrui
    Language: C++
    Result: 正确
    Time:18 ms
    Memory:2212 kb
****************************************************************/

编程小号
上一篇 2025-01-25 12:06
下一篇 2025-02-08 07:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/99345.html