当前位置: 首页 > 知识库问答 >
问题:

将平面上的点分成三个骰子

贺光华
2023-03-14

我有一个(从上往下)的图像,一卷3(6面)骰子,我已经提取了点的坐标,留给我3..18点。

我怎样才能找到骰子上滚动的是什么,或者换句话说,是哪几个点组合在一起形成一个骰子呢?

到目前为止,我已经把它简化为一个求3个圆的问题,这样每个点正好位于一个圆中,最大的圆的大小被最小化。

我已经想到了两种可能的方法,但都只是勉强太慢。

方法2:找到所有可能的三元圆(由1-3个点定义)。放弃包含包含超过6个点的圆、其他圆中已有的点、大于已找到的最佳解中最大圆的圆或不围绕每个点的解的任何解。

有没有更有效的算法来解决这个问题,因为我只想出了大部分暴力的解决方案?我需要一个最坏的情况下的时间约1s,理想的平均时间高达10ms。

共有1个答案

长孙阳焱
2023-03-14

在最坏的情况下有18点数,最多有

>>> sum(math.comb(18, i) for i in range(1, 7))
31179

可能的子集介于1到6个点数之间。丢弃那些最小的包围圈(使用Emo Welzl的随机化算法)包围一个不在子集中的pip的所有这些。利用Sauer-Shelah引理和盘的VC维数为3的事实,我们观察到剩余子集的个数最多

>>> sum(math.comb(18, i) for i in range(4))
988

(编辑:其实我们可以试一下由三组点生成的磁盘,由成对点生成的磁盘,以及单个点生成的磁盘。)现在我们寻找三个成对不相交的子集,它们的并集就是一切。通过位图对子集进行索引、在子集对上进行循环以及测试1)这些子集是否不相交2)其并集的补码是否也是子集来有效地实现这一目标。

 类似资料:
  • 题目链接 Lintcode 题目描述 把 n 个骰子扔在地上,求点数和为 s 的概率。 解题思路 动态规划 使用一个二维数组 dp 存储点数出现的次数,其中 dp[i][j] 表示前 i 个骰子产生点数 j 的次数。 空间复杂度:O(N2) // java public List<map.entry> dicesSum(int n) { final int face = 6; fi

  • 1-4:玩家从1-6随机向前移动 5:玩家从4-11向前移动一个随机量(随机8+4) 6:玩家移动到另一个玩家所在的位置(见下文) 我是新的代码编写(这是我的第四个程序编写),并没有广泛的知识知道什么是错误的。代码不需要熟练地完成,我只想让它正常工作。我们非常感谢您的帮助。 }

  • 一、题目 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s 的所有可能的值出现的概率。 二、解题思路 解法一:基于通归求解,时间效率不够高。 先把n个骰子分为两堆:第一堆只有一个,另一个有n- 1 个。单独的那一个有可能出现从1 到6 的点数。我们需要计算从1 到6 的每一种点数和剩下的n-1 个骰子来计算点数和。接下来把剩下的n-1个骰子还是分成两堆,第一堆只有一个, 第二堆

  • 去年年底被裁 遂回家过年,回来后问朋友要了一份新整合的Java八股,死磕了几个月,3月月底到现在大概二十天面试,该说不说今年行情真的一般般,大多数已读不回,不过运气好加上准备充分,今年面试一个没挂,拿了4个offer选择了百度云。 百度云3面面经 时长大概50分钟 1.二分查找 2.合并二叉树,原题好像,没A做完到30min 3.挖项目,谈谈你对docker的理解? 4.docker和虚拟机有什么

  • 我试图创建一个程序,掷2个骰子,给出和的数量,然后将它们相加。我得到了骰子的随机数,但是当它们相加(总和)时,总数是不正确的。 我尝试过更改,,我已经将总和更改为,但总和总是出错。如果有人可以查看代码,看看我是否将其他所有内容放在正确的位置。提前感谢。 这应该是掷骰子1,给我骰子1的面值,然后给我骰子2的面值,然后给我两个骰子的总数。

  • 给定一个字符串,我们必须将字符串分成所有不同的两部分和三部分(排列不重要)。例如: 答案是 答案是 怎么做?你能提供一个尽可能的时间复杂度的代码吗?