UVA - 524 Prime Ring Problem
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
Description
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers
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
6 8
Sample Output
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
紫書194頁原題
題解:輸入正整數n,把1—n組成一個環,是相鄰的兩個整數為素數。輸出時從整數1開始,逆時針排列。同一個環恰好輸出一次,n (0 < n <= 16)
暴力解決會超時,應用回溯法,深度優先搜索
#include<iostream> #include<cstring> #include<cmath> using namespace std; int n; int a[20],vis[20]; int isp(int n) //判斷是否為素數 { if(n<2) return false; for (int i=2;i*i<=n; i++) { if(n % i == 0) return false; } return true; } void dfs(int s) { if(s==n&&isp(a[1]+a[n])) //遞歸邊界。別忘了測試第一個數和最后一個數 { for(int i=1; i<n; i++) cout<<a[i]<<" "; cout<<a[n]<<endl; } else { for(int i=2; i<=n; i++) { if(!vis[i]&&isp(i+a[s])) //如果i沒有用過,並且與錢一個數之和為素數 { a[s+1]=i; vis[i]=1; //標記 dfs(s+1); vis[i]=0; //清除標記 } } } } int main() { int t=0; while(cin>>n) { memset(vis,0,sizeof(vis)); a[1]=1; if(t!=0) cout<<endl; //一定注意輸出格式 t++; cout<<"Case "<<t<<":"<<endl; dfs(1); } return 0; }
