hdoj--1016--Prime Ring Problem(递归回溯)



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


  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
    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;
    }

猜你喜欢

转载自blog.csdn.net/sodacoco/article/details/79690150
今日推荐