第六届蓝桥杯JavaA组 第九题 垒骰子

本文深入探讨了赌圣ATM在晚年迷恋垒骰子的现象,发现某些数字的面紧贴会互相排斥。文章通过数学方法计算在给定互斥现象条件下,不同垒骰子方式的数量,并采用搜索算法求解复杂情况下的方案数。讨论了如何通过确定每个色子的地面来计算总的排列组合数,同时考虑了每个色子的4个侧面的旋转自由度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。

不要小看了 atm 的骰子数量哦~

「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 不能紧贴在一起。

「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。

「样例输入」
2 1
1 2

「样例输出」
544

「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

这题看题看了半天,前八到1小时45分钟搞定,时间全耗在后面两道题上了。
没想到好办法,但总不能空着吧,于是死马当成活马医了。蓝桥杯编程题应该是按数据通过率给分的,官网(lx.lanqiao.org)给出的题一般都是十组数据,然后按照通过数据的组数给分。说实话,这个oj比较烂,要是不参加蓝桥,想必没人上去A题吧。恩,言归正传,我最后硬是把这道题用搜索的办法给做了(只能通过30%的数据)。晚上回来再想想,想到好方法在发上去。

思路:依次确定每个色子的地面。当然最后还要乘以4^n,因为每个色在还有4个侧面可以旋转,而且是独立的。

import java.util.Scanner;


public class _9 {
    static Scanner in = new Scanner(System.in);
    static int n, m;
    static int[][] oje = new int[7][7];
    static int count = 0;
    static int[] dui = {0, 4, 5, 6, 1, 2, 3};
    static int BigInt = 1000000007;
    public static void main(String[] args) {
        n = in.nextInt(); m = in.nextInt();
        int a, b;
        for (int i = 0; i < m; i++) {
            a = in.nextInt(); b = in.nextInt();
            oje[a][b] =1;
            oje[b][a] = 1;
        }

        dfs(0, -1);
        int ans = 1;
        for (int i = 0; i < n; i++) {
            ans = (ans*4)%BigInt;
        }
        System.out.println((count*ans)%BigInt);
    }


    private static void dfs(int i, int di) {
        if(i==n) {
            count++;
            if(count>BigInt) count -= BigInt;
        } else {
            if(di==-1) {
                for (int j = 1; j < 7; j++) {
                    dfs(i+1,dui[j]);
                }
            } else {
                for (int j = 1; j < 7; j++) {
                    if(oje[j][di]==0) {
                        dfs(i+1, dui[j]);
                    }
                }
            }
        }
    }
}
### 关于第四届蓝桥杯 Java A目及解答 目前提供的引用中并未直接提及第四届蓝桥杯 Java A的具体目及其解答。然而,可以通过分析其他届次的相关目来推测可能涉及的内容以及解方法。 #### 蓝桥杯竞赛特点 蓝桥杯大赛通常会考察选手的基础编程能力、算法设计能力和逻辑思维能力。Java A作为最高难度级别之一,其目往往涵盖了较复杂的算法和数据结构应用。以下是基于往届比赛总结的一些常见考点: 1. **基础算法** 基础算法包括但不限于贪心法、动态规划、回溯法(DFS/BFS)、分治法等。例如,在某些目中可能会要求实现深度优先搜索(DFS)或广度优先搜索(BFS),用于解决路径寻找或者状态空间探索等问[^1]。 2. **字符串处理** 字符串操作也是常见的考查点之一。这不仅限于简单的字符匹配,还可能涉及到正则表达式、模式识别甚至压缩编码等内容。比如有一道关于反转二进制位的目就属于此类范畴[^3]。 3. **数学建模与计算几何** 数学问是历年来的重要成部分,有需要运用到合数论、概率统计等方面的知识;另外还有部分试聚焦于平面图形的操作——如判断线段相交与否、求多边形面积等等[^2]。 4. **优化技巧** 对于大规模输入的数据集来说,如何提高程序运行效率显得尤为重要。这就意味着参赛者不仅要写出功能正确的代码,还需要考虑间复杂度和空间复杂度之间的平衡关系。如果单纯依赖暴力枚举,则很可能因为超出规定限而丢掉分数。 --- #### 解决方案框架建议 针对上述提到的各种类型的问,这里给出一些通用性的解决方案框架供参考: - 如果遇到排列合类问,可以尝试采用递归函数配合剪枝策略减少不必要的分支运算; - 当面临图遍历,应明确区分连通性和可达性概念,并合理选用队列(适用于层序访问)还是栈(适合深入挖掘); - 处理数值型挑战,除了常规算术外还要注意边界条件设定以及溢出防护; - 设计模拟场景下的交互流程前先梳理清楚各个阶段的状态转移规律. 下面展示一段伪代码表示如何通过递归来完成全排列生成任务: ```java public class Permutation { public static void permute(int[] nums, int start){ if(start == nums.length -1 ){ System.out.println(Arrays.toString(nums)); }else{ for(int i=start;i<nums.length;i++){ swap(nums,start,i); //交换位置 permute(nums,start+1); //继续向下一层迭代 swap(nums,start,i); //恢复原状以便下一轮循环使用 } } } private static void swap(int []arr,int a ,int b){ int temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; } } ``` 此段代码展示了基本的递归思想应用于数元素重新排序的过程当中. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值