• HDUOJ-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
     
    Source
    思路:循环加和,递归求解
    代码:
    #include<iostream>
    #include<math.h>
    #include<string.h>
    using namespace std;
    int vis[50];//标记访问数组
    int ans[50];//定义循环数组
    int N;
    bool is_prime(int n)//判断是否为素数,可以使用打表的方式
    {
        int i, j;
        if (n < 2)
        {
            return false;
        }
        for (i = 2; i <= sqrt(n); i++)
        {
            if (n%i== 0)
            {
                return false;
            }
        }
        return true;
    }
    void out_put()//输出满足循环和为素数
    {
        int i;
        for (i = 1; i < N; i++)
        {
            cout << ans[i] << " ";
        }
        cout << ans[i] << endl;
    }
    void DFS(int step)//深度优先  递归调用
    {
        if (step == N&&is_prime(ans[N] + 1))//到达递归出口
        {
            out_put();
            return;
        }
        else
        {
            for (int i = 2; i <= N; i++)
            {
                if (vis[i] == 0 && is_prime(ans[step] + i))//未访问,并且相邻加和为1
                {
                    ans[step + 1] = i;//赋值给输出数组
                    vis[i] = 1;//标记为访问
                    DFS(step + 1);//深度递归下去
                    vis[i] = 0;//标记为未访问
                }
            }
        }
    }
    int main()
    {
        int t = 1;
        while (cin >> N)
        {
            //cout << is_prime(N) << endl;
            memset(vis,0, sizeof(vis));//访问数组初始化
            ans[1] = 1;
            cout << "Case " << t <<":"<< endl;//注意:输出一定要按照题目所给出的格式进行,否则报错
            DFS(1);
            t++;
            cout << endl;
        }
        return 0;
    }
  • 相关阅读:
    搜狗输入法--评价
    课堂练习--找水王
    学习进度条---第十二周
    Java接口与继承动手动脑
    Java数组课后作业
    Java语言String字符串课后作业
    Java类和对象课后作业
    Java语言第四讲
    Java语法基础----课后实践作业
    Java课堂作业-------参数求和
  • 原文地址:https://www.cnblogs.com/gcter/p/10307908.html
Copyright © 2020-2023  润新知