九度1459:Prime ring problem

来源:互联网 发布:造字软件在线使用 编辑:程序博客网 时间:2024/06/06 18:41
题目1459:Prime ring problem

时间限制: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.

样例输入:
68
样例输出:
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2
提示:

用printf打印输出。

*************************************************

递归。本渣渣不会,借鉴的别人的代码,好好研读吧~

第一遍读不懂再读第二遍,第二遍都不懂再读第三遍.....

#include<cstdio>#include<cmath>#include<algorithm>#define maxSize 10010using 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.csdn.net/qq_26398495/article/details/55803066

*****************************************

坚持,而不是打鸡血~