Prime Ring Problem HDU - 1016
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.
Note: the number of first circle should always be 1.
Inputn (0 < n < 20).
OutputThe 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
思路:DFS遍历所有结果
AC Code:
#include<iostream> #include<cstring> using namespace std; int num[100]; int vis[100]; int n; bool isPrime (int k) { for (int i = 2; i * i <= k; i++) if (k % i == 0) return false; return true; } void dfs (int k) { if (k > n) { if (isPrime (num[1] + num[n])) { for (int i = 1; i < n; i++) printf("%d ", num[i]); printf("%d\n", num[n]); } return ; } for (int i = 2; i <= n; i++) { if (vis[i] == false) { if (isPrime (num[k - 1] + i)) { num[k] = i; vis[i] = true; dfs (k + 1); vis[i] = false; } } } return ; } int main() { int sum = 1; while(~scanf ("%d", &n)){ printf ("Case %d:\n", sum++); memset (vis, false, sizeof(vis)); num[1] = 1; vis[1] = true; dfs(2); putchar('\n'); } }
人生不如意的时候,是上帝给的长假,这个时候应该好好享受假期。
突然有一天假期结束,时来运转,人生才是真正开始了。
突然有一天假期结束,时来运转,人生才是真正开始了。