【題解】ZeroJudge d396: 00524 – Prime Ring Problem

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=d396

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int n, Case=1;
int use[17], ans[17];
vector<int> v[17];
int prime[35] = {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, 0};

void printAns(){
    for (int i=0; i<n; i++)
        cout << ans[i] << ' ';
    cout << '\n';
}
void dfs(int idx){
    
    if (idx == n){
        if (prime[ans[0] + ans[n-1]]) printAns();
    }
    
    for (auto i : v[ans[idx-1]]){
        if (i > n) continue;
        if (!use[i]) {
            use[i] = 1;
            ans[idx] = i;
            dfs(idx+1);
            use[i] = 0;
        }
    }
}

int main() {
    for (int i=1; i<=16; i++){
        for (int j=1; j<=16; j++){
            if (i == j) continue;
            if (prime[i+j]){
                v[i].push_back(j);
            }
        }
    }
    while (cin >> n){
        memset(use, 0, sizeof(use));
        memset(ans, 0, sizeof(ans));
        use[0] = 1;
        use[1] = 1;
        ans[0] = 1;
        cout << "Case " << Case++ << ":\n";
        dfs(1);
    }
    return 0;
}
分享本文 Share with friends