UVA524-Prime Ring Problem(搜索剪枝)
Posted npugen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA524-Prime Ring Problem(搜索剪枝)相关的知识,希望对你有一定的参考价值。
Problem UVA524-Prime Ring Problem
Accept:6782 Submit:43814
Time Limit: 3000 mSec
Problem Description
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers 1,2,...,n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle should always be 1.
Input
n (0 < n ≤ 16)
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. You are to write a program that completes above process.
Sample Input
Sample Ouput
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
题解:回溯法经典题目,回溯就是剪枝嘛,这个题的剪枝就是题意,水题。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 using namespace std; 6 7 const int maxn = 20,maxp = 50; 8 bool vis[maxn]; 9 int n,ans[maxn]; 10 11 bool is_prime[maxp]; 12 int prime[maxp]; 13 14 void Euler(){ 15 memset(is_prime,true,sizeof(is_prime)); 16 int cnt = 0; 17 is_prime[0] = is_prime[1] = false; 18 for(int i =2;i < maxp;i++){ 19 if(is_prime[i]) prime[cnt++] = i; 20 for(int j = 0;j<cnt && prime[j]<=maxp/i;j++){ 21 is_prime[i*prime[j]] = false; 22 if(i%prime[j] == 0) break; 23 } 24 } 25 } 26 27 void dfs(int cur,int *ans){ 28 if(cur==n && is_prime[ans[n-1]+ans[0]]){ 29 for(int i = 0;i < n;i++){ 30 if(i != 0) printf(" "); 31 printf("%d",ans[i]); 32 } 33 printf(" "); 34 return; 35 } 36 for(int i = 2;i <= n;i++){ 37 if(!vis[i] && is_prime[ans[cur-1]+i]){ 38 vis[i] = true; 39 ans[cur] = i; 40 dfs(cur+1,ans); 41 vis[i] = false; 42 } 43 } 44 } 45 46 int main() 47 { 48 //freopen("input.txt","r",stdin); 49 int iCase = 1; 50 Euler(); 51 while(~scanf("%d",&n)){ 52 if(iCase > 1) printf(" "); 53 memset(vis,false,sizeof(vis)); 54 ans[0] = 1; 55 vis[1] = true; 56 printf("Case %d: ",iCase++); 57 dfs(1,ans); 58 } 59 return 0; 60 }
以上是关于UVA524-Prime Ring Problem(搜索剪枝)的主要内容,如果未能解决你的问题,请参考以下文章
UVA524-Prime Ring Problem(搜索剪枝)
UVa 524 Prime Ring Problem(回溯法)
UVa524 Prime Ring Problem (回溯法)