垒骰子蓝桥杯java

时间: 2025-04-17 22:39:26 浏览: 15
### 关于蓝桥杯竞赛中Java实现垒骰子问题 在解决这个问题时,可以采用动态规划的方法来提高效率并减少重复计算。给定n个骰子和m组互斥关系,目标是找出所有可能的不同垒骰子的方式,并返回结果模 \(10^9 + 7\)。 #### 动态规划方法解析 定义 `dp[i][j]` 表示第i层(从下往上计数)的顶部显示数字为j的情况下的总方案数[^3]。为了简化状态转移过程,还需要考虑如何处理相邻两层之间的约束条件——即某些面不能相互接触。对于每一个新的骰子放置,在不违反已知限制的前提下更新当前的状态矩阵。 初始化阶段设置底层的各种可能性: - 对于第一个骰子来说,它上面任何一个面都可以作为底面,因此初始状态下每个合法的位置都有\(4!\)=24种摆放形式(考虑到旋转不变性),但是因为存在互斥情况所以实际数目可能会更少一些。 之后逐层累加直到达到指定层数为止。每次迭代过程中都要遍历之前一层的所有有效配置,并尝试将新加入的一个标准六面体放在其上方而不违背任何既定规则。如果成功,则相应增加该组合模式的数量统计值。 最后求得的就是最顶层各个面上所对应的累积次数之和再取余操作后的最终答案。 ```java import java.util.*; public class DiceStacking { private static final long MOD = (long)(Math.pow(10, 9)) + 7; public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 骰子数量 int m = scanner.nextInt(); // 互斥对数 List<int[]> conflicts = new ArrayList<>(); for(int i=0;i<m;++i){ int a = scanner.nextInt(); int b = scanner.nextInt(); conflicts.add(new int[]{a,b}); } solve(n,conflicts.toArray(new int[m][])); } private static void solve(int n,int[][] conflictPairs){ boolean[][] isConflict = new boolean[7][7]; for(var pair : conflictPairs){ isConflict[pair[0]][pair[1]] = true; isConflict[pair[1]][pair[0]] = true; } long[][] dp = new long[n+1][7]; Arrays.fill(dp[1], 1); // 初始化第一层 for(int level=2;level<=n;++level){ for(int topFace=1;topFace<7;++topFace){ for(int prevTopFace=1;prevTopFace<7;++prevTopFace){ if(!isConflict[topFace][getOpposite(prevTopFace)]){ dp[level][topFace]=(dp[level][topFace]+dp[level-1][prevTopFace])%MOD; } } } } System.out.println(Arrays.stream(dp[n]).sum()%MOD); } private static int getOpposite(int faceValue){ switch(faceValue){ case 1:return 4; case 2:return 5; case 3:return 6; case 4:return 1; case 5:return 2; default: return 3; } } } ``` 此代码实现了上述逻辑流程图中的核心部分,通过构建二维数组存储每一层不同顶面朝向的可能性分布状况,并利用循环结构完成自底向上逐步推导的过程。注意这里使用了流式API来进行最后一行的结果汇总输出以便更加简洁直观地表达意图。
阅读全文

相关推荐

大家在看

recommend-type

Silabs_Headunit_V3.2.3734 for A55.zip

si47xx驱动源代码 稍作修改即可使用到产品中去!车机开发人员懂得
recommend-type

UsbMidiKeyboard.zip_STM32 MIDI_instrumenthu3_midikeyboardstm32_m

STM32的USB例程详细分析及程序代码
recommend-type

毕业设计&课设-一个基于Matlab的PET仿真和重建框架,具有系统矩阵的分析建模,能够结合各种数据….zip

matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随
recommend-type

MarkdownEditor精简绿色版

MarkdownEditor精简绿色版
recommend-type

opencv-4.0.0-linux版本

因为opencv官网的下载速度太慢,所以特地整理了几个常用的版本,提供给国内伙伴们下载。此处为opencv-4.0.0的linux版本,其他的版本请参见我的博客【https://blog.csdn.net/LEON1741/article/details/90211061】

最新推荐

recommend-type

Java实现的简单掷骰子游戏示例

Java实现的简单掷骰子游戏示例 本文主要介绍了Java实现的简单掷骰子游戏,涉及Java随机数的简单生成、运算与判定相关操作技巧。该游戏的规则是掷两个骰子,每个骰子有六面,分别为1、2、3、4、5、6。检查这两个骰子...
recommend-type

简单的led电子骰子的电路

LED电子骰子是一种创新的电子装置,它模拟了传统骰子的功能,但通过电子方式产生随机数字。这种设备通常由几个关键组件组成,包括LED(发光二极管)、触摸感应元件、电容、三极管、555定时器、计数器(如74LS192)...
recommend-type

掷6面骰子6000次每个点数出现的概率

在Java代码示例中,我们看到一个名为`Statistics`的类,其中包含了一个模拟掷骰子6000次的过程。代码使用`Random`类来生成随机数,`nextInt(6) + 1`方法确保生成的数字在1到6之间,模拟了骰子的六个可能结果。数组`...
recommend-type

java程序员招聘面试题

7. **日期数字问题**:在骰子上设置1-31作为日期,1-12作为月份,年份可以用其他方式表示,如掷多次骰子。 **第四组** 1. **海盗分宝石问题**:1号海盗提出分配99颗宝石,自己留下,给2号1颗。这样无论剩下多少人,...
recommend-type

菜鸟要学的数据库必备知识.ppt

菜鸟要学的数据库必备知识.ppt
recommend-type

JLink ARM V4.80驱动安装与功能详解

标题“JLink ARM v4.80驱动”和描述中透露出多个有关IT行业的知识点,以下将详细解释这些知识点: 1. JLink ARM驱动程序: JLink ARM驱动程序是Segger公司为其J-Link系列ARM调试器提供支持的软件驱动。它支持各种ARM内核的微控制器,通过USB接口与计算机连接,实现程序的调试与下载。 2. J-Link USB驱动程序的安装: 安装JLink ARM软件时,会自动安装J-Link USB驱动,这对于确保调试器能够被计算机识别和使用是必不可少的。同时,如果用户已经安装了旧版本的J-Link软件,新版本的安装程序不会覆盖旧版本,而是在不同的目录下安装,从而实现多版本共存。 3. 软件包内容: - GDB服务器:支持GDB调试器以及其他采用相同协议的调试器,提供图形用户界面(GUI)和命令行版本,方便开发者在各种环境下进行调试。 - J-Link Configurator:一个免费的实用程序,用于管理通过USB或以太网连接到PC的多个J-Link设备。 - J-Link Commander:一个简单的命令行实用工具,主要用于诊断和故障排除。 - J-Link远程服务器:一个免费的实用工具,允许用户通过TCP/IP远程使用J-Link/J-Trace。 - SWO查看器:一个免费的工具,通过SWO引脚显示目标设备的终端输出。 - J-Mem:一个内存查看器,用于查看和分析目标设备的内存内容。 - J-Link DLL Updater:允许更新使用J-Link DLL的第三方应用程序。 - 免费的闪存编程工具:允许将bin文件编程到流行评估板的内部/外部闪存中。 - USB驱动程序:包括具有CDC功能的J-Links的驱动程序。 - 用户手册:提供J-Link用户指南、J-Flash用户指南、RDI用户指南、GDB服务器用户指南和Flasher ARM用户指南。 - J-Link DLL、J-Flash、J-Link RDI DLL的发布说明。 - J-Flash:包括大多数流行评估板的示例项目。 - J-Link RDI:支持ARM RDI标准,使得J-Link与兼容RDI的调试器兼容。 4. J-Link技术的特点与优势: - 兼容性:与多种开发环境(如Keil、IAR、Eclipse等)兼容。 - 速度:在所有支持的接口和设备上提供高速调试和下载速度。 - 多种连接方式:除了USB,还包括以太网、SPI和串行端口等接口。 - 操作简便:提供友好的用户界面和大量文档资源。 5. 软件版本号: 软件的版本号“v4.80”表示这是一个特定的版本号,用户可以通过版本号了解软件的更新历史和新增功能。 6. 文件名称: 文件“Setup_JLinkARM_V480.exe”是JLink ARM v4.80版本的安装程序文件,通过此文件可以安装JLink ARM软件和所有包含的工具与驱动程序。 了解JLink ARM v4.80驱动程序的知识点可以帮助开发者或硬件工程师更好地使用J-Link调试器进行ARM微控制器的开发与调试工作。通过安装相应的软件和驱动,他们可以利用丰富的工具集进行程序下载、调试和优化,从而提高开发效率和产品质量。
recommend-type

系统调优艺术:如何让Linux在VirtualBox中达到最佳图形性能

# 1. 理解Linux系统调优的基础 Linux系统调优是一项复杂的工作,它涉及到对操作系统的深入理解和精确配置,以确保系统在运行应用程序时能够达到最优性能。为了有效地进行调优,首先需要对Linux系统的核心组成部分有基本的了解,包括内核、文件系统、内存管理以及进程调度等。这些组件
recommend-type

怎么启动superset

<think>嗯,用户现在想启动Superset服务,但不太清楚具体的命令行操作。首先,我需要回忆一下之前用户提到的安装步骤和相关引用内容。根据引用[1],用户已经安装了Python环境和Miniconda,创建了Python3.7的环境,并且部署了Superset。引用[2]和[3]提到在Windows环境下进入安装路径,创建管理员账户,以及编写启动脚本。而引用[4]是关于Docker部署,引用[5]是Miniconda的下载。用户的问题是如何在命令行中启动Superset服务。首先,我应该考虑不同操作系统下的启动方式,比如Windows和Linux/macOS。根据引用[3],用户提到了在
recommend-type

2013年26万条手机号归属地数据库详情

根据提供的文件信息,我们可以得到以下知识点: 1. 手机号归属地数据库的概念及应用: 手机号归属地数据库是一种存储手机号码前几位与地理区域、运营商等信息对应关系的数据集合。这类数据库广泛应用于通信、网络服务、营销等行业,它们通过查询数据库来快速确定手机号码的归属地,进而判断手机用户的地理位置、使用的网络类型等信息。该数据库对于电话营销、用户行为分析、反欺诈检测等领域尤为重要。 2. 手机号归属地数据库中包含的关键字段: - 手机归属地:这个字段通常指明了手机号码所属的地理位置,例如某省某市某区等。 - 手机卡类型:该字段用于描述手机号码所对应的服务类型,例如是否是预付费卡或后付费卡,是否为3G/4G/5G等。 - 所属地邮编:指明了该手机号码所属地区的邮政编码。 3. 数据库的时间戳(2013-01)和数据量(26万条)的含义: 时间戳(2013-01)表示数据库中所包含的手机号归属信息是截至到2013年1月的数据。数据量(26万条)则表明该数据库大约包含26万条手机号的归属信息记录。需要注意的是,随着时间推移,一些手机号码可能已经发生了变更,因此使用此类数据库时需要考虑到信息可能已经不再是最新的。 4. 手机号归属地数据库的格式(MobileNumber.mdb): 从文件名称列表中可以看出,该数据库文件的格式是.mdb。.mdb是Microsoft Access数据库文件的扩展名,表示这个数据库文件是使用Microsoft Access数据库管理系统创建的。Access数据库是基于关系型数据库模型构建的,可以存储结构化数据,并允许用户查询、更新和管理数据库。.mdb文件格式通常可以用来创建表、查询、表单、报表和宏等数据库对象。 5. 如何使用手机号归属地数据库: - 创建查询:为了确定某手机号码的归属地,用户可以在数据库管理系统中创建查询语句,输入特定的手机号码或者手机号码范围进行查询。 - 数据分析:企业或个人可以利用该数据库对客户数据进行分析,从而为产品定位、市场推广等提供数据支持。 - 程序集成:开发者可以将该数据库集成到他们的应用程序中,为用户提供手机号码验证、归属地显示等服务。 6. 数据库的安全性和隐私保护: 使用手机号归属地数据库时,用户必须遵守相关的法律法规。手机号码属于个人隐私信息,非法使用或滥用这些数据都可能触犯法律。因此,使用数据库的个人或企业必须确保符合《中华人民共和国个人信息保护法》等相关的数据保护法规的要求,以及保障数据的安全和隐私。 7. 手机号归属地数据库的更新和维护: 由于手机号码的分配和变更是一个动态过程,因此手机号归属地数据库需要定期进行更新以确保数据的准确性。数据库管理员需要负责监控新号码的分配情况以及老号码的停用情况,并及时更新数据库中的信息。 以上知识点涵盖了手机号归属地数据库的基本概念、字段含义、数据格式、使用方法、安全性和隐私保护以及更新维护等方面的内容。对数据库的详细了解可以帮助用户有效地利用这类信息资源,同时注意遵守相关的法律法规,保障用户隐私安全。
recommend-type

VirtualBox显卡直通完全手册:跟着专家的步骤来设置和排除故障

# 1. VirtualBox显卡直通的基本概念 在当今的技术行业中,虚拟化已成为一种流行且高效的方式来运行多个操作系统以及应用程序。VirtualBox作为一种流行的开源虚拟化软件,为用户提供了灵活的虚拟机解决方案。其中一个高级功能是显卡直通,它允许虚拟机直接访问宿主机的物理显卡,从而提供图形处理能力的显著提升。 显卡直通的基