HDOJ-1016 Prime Ring Problem【DFS】
Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 47217 Accepted Submission(s): 20859
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.
![](http://acm.hdu.edu.cn/data/images/1016-1.gif)
Note: the number of first circle should always be 1.
![](http://acm.hdu.edu.cn/data/images/1016-1.gif)
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.
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> #include <cstring> using namespace std; bool prime[38] = { 0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1 }; bool vis[22]; int n, ring[22]; void ans() { cout << ring[0]; for (int i = 1; i < n; i++) { cout << ' ' << ring[i]; } cout << '\n'; } void dfs(int pos) { if (pos == n &&prime[ring[n - 1] + ring[0]]) { ans(); return; } for (int i = 2; i <= n; i++) { if (!vis[i] && prime[i + ring[pos - 1]]) { vis[i] = true; ring[pos] = i; dfs(pos + 1); vis[i] = false; } } } int main() { int case_num = 1; ring[0] = 1; while (cin >> n) { memset(vis, false, sizeof(vis)); cout << "Case " << case_num << ":" << endl; case_num++; dfs(1); cout << endl; } return 0; }