时间限制:2 秒
内存限制:128 兆
特殊判题:否
提交:3027
解决:1239
-
题目描述:
-
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.
-
输入:
-
n (1 < n < 17).
-
输出:
-
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.
-
样例输入:
-
6 8
-
样例输出:
-
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
-
提示:
-
用printf打印输出。
-
*************************************************
-
递归。本渣渣不会,借鉴的别人的代码,好好研读吧~
-
第一遍读不懂再读第二遍,第二遍都不懂再读第三遍.....
-
#include<cstdio> #include<cmath> #include<algorithm> #define maxSize 10010 using namespace std; int cir[maxSize] = { 0 }; //记录排列 bool hashArray[maxSize] = { false };//是否加入队列 void myPrint(int n) {//打印 for (int i = 1; i < n; i++) { printf("%d ", cir[i]); } printf("%d\n", cir[n]); } bool isPrime(int n) {//判断是否为素数 int sqr = round(sqrt(n)); for (int i = 2; i <= sqr; i++) { if (n % i == 0) return false; } return true; } void F(int n, int index) { if (index == n + 1) {//递归基 //判断首尾相加是否为素数,若成功 打印 if (isPrime(cir[n] + cir[1])) { myPrint(n); } } else {//0~index-1 已满足 for (int i = 2; i <= n; i++) { if (hashArray[i] || (!isPrime(i + cir[index-1])) ) continue; else { hashArray[i] = true; cir[index] = i; F(n, index + 1);//递归 hashArray[i] = false;//恢复 } } } } int main() { int n, num = 1; while (scanf("%d", &n) != EOF) { printf("Case %d:\n", num++);//输出编号 cir[1] = 1; hashArray[1] = true;//起点 F(n, 2); printf("\n"); } return 0; }
代码转自real_3stone -
http://blog.youkuaiyun.com/qq_26398495/article/details/55803066
-
*****************************************
-
坚持,而不是打鸡血~