质数环-DFS
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22702 Accepted Submission(s): 10108 Problem Description A ring is compose of n circles as shown in diagram. Put natural number 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 < 20). 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. Print solutions in lexicographical order. You are to write a program that completes above process. Print a blank line after each case. 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
#include<iostream> #define MAX 25 using namespace std; int a[MAX], b[MAX], n, t; bool visit[MAX], prime[MAX*2]; int gcd(int x, int y){ if (y == 0)return x; return gcd(y, x%y); } void dfs(int i, int pos){ if (pos == n && prime[b[pos]+1]){ for (int i = 1; i < pos; i++){ cout << b[i] << " "; } cout << b[pos] << endl; return; } for (int j = 2; j <= n; j++){ if (!visit[j] && prime[b[i] + a[j]]){ visit[j] = true; b[i + 1] = a[j]; dfs(i + 1, pos + 1); visit[j] = false; } } return; } int main() { t = 0; while (cin >> n){ for (int i = 1; i <= n; i++){ a[i] = i; } fill(visit, visit + MAX, false); fill(prime, prime + MAX * 2, true); for (int i = 2; i < MAX * 2; i++){ if (prime[i]){ for (int j = i * 2; j < MAX * 2; j += i){ prime[j] = false; } } } cout << "Case " << ++t << ":" << endl; b[1] = 1; visit[1] = true; dfs(1, 1); cout << endl; } return 0; }
世上无难事,只要肯登攀。