Hdu1016---Prime Ring Problem解题报告(素数环DFS)

版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/83443855

                                 Prime Ring Problem题目链接

题目意思:

一个圆环,要求首尾两个元素之和为素数,所有相邻元素之和为素数。

按字典序输出所有符合素数环的情况(每个点都需要记录)

思路:暴力深搜+判断素数

AC Code:

#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<list>
#define mod 998244353
#define INF 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i = a; i < b; i++)
using namespace std;
typedef long long ll;
const int MAX_N = 25;
bool vis[MAX_N];
int arr[MAX_N];
bool is_prime(int x){
    if(x == 1){
        return false;
    }
    if(x == 2){
        return true;
    }
    if(x % 2 == 0){
        return false;
    }
    for(int i = 3; i <= (int)sqrt(x); i += 2){
        if(x % i == 0){
            return false;
        }
    }
    return true;
}
void dfs(int step, int n){
    if(step > n && is_prime(arr[1] + arr[n])){
        for(int i = 1; i < n; i++){
            cout<<arr[i]<<" ";
        }
        cout<<arr[n]<<endl;
    }
     for(int i = 2; i <= n; i++){
        arr[step] = i;
        if(is_prime(arr[step] + arr[step - 1]) && !vis[i]){
            vis[i] = 1;
            dfs(step + 1, n);
            vis[i] = 0;
        }
    }
}
int main(){
    int cas = 1, n;
    while(cin>>n){
        printf("Case %d:\n", cas++);
        mst(vis);
        mst(arr);
        arr[1] = 1;
        dfs(2, n);
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/83443855