UVa 524 Prime Ring Problem (回溯)

    xiaoxiao2025-10-20  5

    题意:给你一个偶数N,让你输出一个1到N的排列,这N个数构成一个圆,要求这个圆上所有相邻两个数之和都为素数,输出合法序列。 解法:直接按照题目要求回溯即可。每次模拟放一个合法的数,再看下一次能不能放。直到全放完为止。

    #include <bits/stdc++.h> #define _ ios_base::sync_with_stdio(0);cin.tie(0); #define INF 0x3f3f3f3f #define eps 1e-6 typedef long long LL; const double pi = acos(-1.0); const long long mod = 1e9 + 2015; using namespace std; int N; int a[20]; int vis[20]; int prime[] = {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,0,0,1,0,0,0}; void dfs(int cur) { if(cur == N && prime[a[1] + a[N]]) { for(int i = 1;i < N;i++) printf("%d ",a[i]); printf("%d\n",a[N]); } else { for(int i = 2;i <= N;i++) if(!vis[i] && prime[i + a[cur]]){ a[cur + 1] = i; vis[i] = 1; dfs(cur + 1); vis[i] = 0; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); //freopen("int.txt","r",stdin); //freopen("out.txt","w",stdout); int first = 0; int t = 0; while(cin >> N) { if(first++) puts(""); printf("Case %d:\n",++t); memset(vis,0,sizeof(vis)); a[1] = 1; dfs(1); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1303330.html
    最新回复(0)