1. 程式人生 > 實用技巧 >UVA524 素數環 Prime Ring Problem

UVA524 素數環 Prime Ring Problem

題目大意

    從1到n這n個數擺成一個環,要求相鄰兩個數的和是一個素數。

 題解

   一道簡單的回溯題,遞迴填數,判斷第i個數是否合法。如果合法,填數,判斷是否n個已填滿,如果填滿且與第一位相加也是素數,輸出結果,回溯;否則遞迴填下一個。

    此題中n較小,如果n較大可以使用尤拉篩提前篩出素數,n1查詢。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[25],tot;
bool v[25
]; bool pd(int x) { for(int i=2;i<=x-1;i++) if(x%i==0)return 1; return 0; } void dfs(int x) { tot++;a[tot]=x;v[x]=1; if(tot==n) { if(!pd(1+a[n])) { for(int i=1;i<=n;i++)printf("%d ",a[i]); printf("\n"); } return ; }
for(int i=2;i<=n;i++) { if(v[i]==1)continue; else { int ans=x+i; if(pd(ans))continue; else { dfs(i); v[i]=0;a[tot]=0;tot--; } } } } int main() { int t=0; while
(scanf("%d",&n)!=EOF) { memset(v,0,sizeof(v)); memset(a,0,sizeof(a)); t++; printf("Case %d:\n",t); tot=0; dfs(1); printf("\n"); } return 0; }