HDU 1016 Prime Ring Problem(素数环)(DFS入门水题)

本文详细解析了HDU1016素数环问题,通过使用深度优先搜索算法来解决环中相邻两数之和为素数的问题,并提供了完整的代码实现。

让我们先看一下HDU1016的问题描述:

贴上HDUOJ的题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 54084    Accepted Submission(s): 23945
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
Asia 1996, Shanghai (Mainland China)


题目意思相信大家都明白了,意思就是组成一个素数环,环内相邻的2个数之和为素数,且开头为1,比如输出的第一组实例:1 4 3 2 5 6,1和4相加为素数,1和3不是相邻(看图就知道了),这个题目就用到了DFS深度优先搜索,关于深度优先搜索,这里可以提供一个入门的可以理解一下的链接:http://blog.csdn.net/u011437229/article/details/53188837
在这里,DFS的结束条件是所有数枚举完毕而且相邻两个数之和为素数时结束搜索,输出样例,这里还要注意就是有关输入方面的问题,下面贴出代码:
#include <bits/stdc++.h>
using namespace std;
    int vis[50],a[50],prime[50],n;//遍历数组,结果保存数组,是否为素数的判断数组,输入的数
        void isprime()//判断是否为素数
        {
        int i,j;
        for(i=0;i<50;i++)
        prime[i]=1;//初始值为1(表示假设全部是素数)
        prime[0]=0;
        prime[1]=0;//0不是素数也不是合数,1与0相同性质,但是题目要求初始输出环开头为1
        for(i=2;i<50;i++)//从2到50遍历所有有关倍数
            {
            if(prime[i])//如果是素数,那素数的倍数不是素数
                {
                for(j=i+i;j<50;j+=i)
                prime[j]=0;//素数的倍数全部不是素数,变成0
                }
            }
        }
        void dfs(int step)//DFS核心代码,step表示步数
            {
            int i,j;
            if(step == n+1 && prime[a[n]+a[1]])//判断条件,即步数到N且头尾两数之和为素数
            {
                for(i=1;i<n;i++)//输出段
                printf("%d ",a[i]);
                printf("%d\n",a[n]);
                return ;
            }
            for(i=2;i<=n;i++)//如果上面条件不满足,执行搜索段
                {
                if(!vis[i]&&prime[i+a[step-1]])//如果未被访问到且前一个数和该数之和为素数
                {
                    a[step]=i;//该步数下的数为i
                    vis[i]=1;//访问数组标记
                    dfs(step+1);//关键,深搜的主要思想是递归回溯,利用本身进行第二次搜索
                    vis[i]=0;//如果搜索失败,访问标记清空
                }
                }
            }
        int main()
        {
            int cnt=1;//记录实例数
            a[1]=1;//第一个输出永远是1
            isprime();//素数数组预处理(OJ的特点,在读入数据之前的时间不算在运行时间内)
            while(~scanf("%d",&n))//OJ的特点2,循环输入
            {
                memset(vis,0,sizeof(vis));//清空遍历数组
                printf("Case %d:\n",cnt++);
                dfs(2);//开始深搜
                printf("\n");
            }
            return 0;
    }
这道题的关键还是掌握有关DFS的知识,这道题在DFS的题目里面算入门级别,只要能找到判断条件就可以直接写出

内容概要:本文围绕列车-轨道-桥梁交互仿真研究,基于Matlab平台构建数值模型,系统分析列车运行过程中轨道与桥梁结构间的动态相互作用机制。研究涵盖多体动力学建模、耦合系统运动方程求解、边界条件设定及仿真结果可视化等关键节,重点揭示高速行车条件下基础设施的振动传递规律与力学响应特征。该仿真方法可有效评估结构安全性、舒适性指标及疲劳寿命,为轨道交通工程的设计优化与运维管理提供理论支撑和技术路径。文中配套提供了完整的Matlab代码实现方案及操作说明,便于用户复现、验证和拓展相关研究。; 适合人群:具备Matlab编程基础和结构动力学、车辆动力学等相关专业知识的研究生、科研人员及从事铁路工程、桥梁工程与交通系统安全评估的工程技术人才,尤其适合开展轨道交通耦合振动课的研究者。; 使用场景及目标:①用于高校与科研机构进行列车-轨道-桥梁耦合系统动力学特性的教学演示与科学研究;②支撑高速铁路桥梁的设计优化、运营安全性评估与减振降噪方案验证;③为复杂交通基础设施的多物理场耦合仿真提供建模思路与代码参考。; 阅读建议:建议读者结合所提供的Matlab代码逐模块深入研读,重点关注系统建模假设、质量-刚度-阻尼矩阵构建方法及数值积分算法的实现细节,同时可通过调整参数进行敏感性分析,进一步掌握仿真模型的适用范围与优化方向。
内容概要:本文系统研究了非线性薛定谔方程的物理信息神经网络(PINN)求解方法,提出一种将物理规律嵌入深度学习模型的科学计算新范式。通过构建全连接神经网络架构,将非线性薛定谔方程及其初始/边界条件作为损失函数的核心组成部分,实现了在无须大量标注数据的前提下对复值偏微分方程的高精度数值求解。该方法充分利用自动微分技术精确计算方程残差,有效融合了数据驱动与模型驱动的优势,在光学孤子传播、量子系统演化等典型场景中展现出优异的逼近能力与泛化性能。文中配套提供了完整的Python实现代码,涵盖网络搭建、损失定义、训练优化与结果可视化全流程。; 适合人群:具备Python编程能力与深度学习基础知识,熟悉偏微分方程理论及科学计算的理工科研究生、科研人员,以及从事光学、量子物理、流体力学等领域建模与仿真的工程技术人员。; 使用场景及目标:① 掌握PINN方法的基本原理与实现技巧;② 学习如何将复杂物理方程转化为可训练的神经网络损失项;③ 应用于非线性光学、玻色-爱因斯坦凝聚、波动力学等的仿真与预测;④ 为相关科研课提供可复现的算法原型与代码参考。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点理解神经网络对微分算子的近似机制、损失函数的多任务加权策略以及训练过程中的超参数调优方法,进而可迁移至其他非线性偏微分方程的求解任务,拓展其在交叉学科中的应用边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值