HDU 1016 Prime Ring Problem 题解
2014-07-10 17:02
232 查看
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
Sample Output
本题就是考递归搜索的能力。
数据不大,其他Prime, map等的优化都没多大作用的。
记得记录好数据,就不会有问题了。
不过HDU的判断系统的确垃圾,其他OJ都不会在意末尾多一个空格或者回车的问题的,HDU就一个空格一个回车都一定要按照她的格式,否则就presentation error.
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
本题就是考递归搜索的能力。
数据不大,其他Prime, map等的优化都没多大作用的。
记得记录好数据,就不会有问题了。
不过HDU的判断系统的确垃圾,其他OJ都不会在意末尾多一个空格或者回车的问题的,HDU就一个空格一个回车都一定要按照她的格式,否则就presentation error.
#include <stdio.h> const int MAX_N = 20; int num; int cycle[MAX_N]; bool vis[MAX_N]; bool isPrime(int n) { for (int i = 2; i*i <= n; i++) if (n % i == 0) return false; return true; } bool isLegal(int val, int i) { int left = i-1; if (!isPrime(val+cycle[left])) return false; if (i+1 == num && !isPrime(val+cycle[0])) return false; return true; } void printNums(int i = 1) { if (i == num) { for (int j = 0; j+1 < num; j++) { printf("%d ", cycle[j]); } printf("%d\n", cycle[i-1]); return ; } for (int v = 2; v <= num; v++) { if (vis[v]) continue; if (isLegal(v, i)) { cycle[i] = v; vis[v] = true; printNums(i+1); vis[v] = false; } } } int main() { int t = 0; cycle[0] = 1; while (scanf("%d", &num) != EOF) { printf("Case %d:\n", ++t); for (int i = 2; i <= num; i++) vis[i] = false; printNums(); putchar('\n'); } return 0; }
相关文章推荐
- hdu 1016 Prime Ring Problem(回溯)
- hdu 1016 Prime Ring Problem(DFS)
- hdu1016 Prime Ring Problem()
- HDU 1016 Prime Ring Problem(DFS 素数环问题)
- HDU 1016 Prime Ring Problem(深搜)
- HDU 1016 - Prime Ring Problem
- HDU 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem
- HDU 1016 Prime Ring Problem
- hdu 1016 Prime Ring Problem (dfs)
- Prime Ring Problem hdu 1016 dfs
- 九度 Prime Ring Problem hdu 1016
- HDU 1016 Prime Ring Problem 题解
- Hdu-1016 Prime Ring Problem【DFS】
- HDU 1016 Prime Ring Problem(水题纯暴)
- HDU 1016 Prime Ring Problem(DFS回溯+素数判断)
- day3 HDU 1016 Prime Ring Problem
- HDU 1016 Prime Ring Problem(DFS)
- hdu 1016 Prime Ring Problem