- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是 Google Code Jam 资格赛(现已结束)的一道题。如何解决这个问题?
注意:如果您有与答案中讨论的方法不同的方法,请分享它,以便我们扩展我们对解决此问题的不同方法的了解。
Minesweeper 是一款在 1980 年代流行的电脑游戏,至今仍包含在某些版本的 Microsoft Windows 操作系统中。本题思路类似,但不假设你玩过扫雷。
在这个问题中,您在相同单元格的网格上玩游戏。每个单元格的内容最初是隐藏的。网格的 M 个不同单元格中隐藏着 M 个地雷。没有其他细胞含有地雷。您可以单击任何单元格以显示它。如果显示的单元格包含地雷,则游戏结束,您输了。否则,显示的单元格将包含一个介于 0 和 8 之间的数字,包括 0 和 8,这对应于包含地雷的相邻单元格的数量。如果两个单元格共享一个角或一条边,则它们是相邻的。此外,如果显示单元格包含 0,则显示单元格的所有邻居也会自动显示,递归地。当所有不包含地雷的单元格都被显示时,游戏结束,您获胜。
例如,棋盘的初始配置可能如下所示('*' 表示地雷,'c' 是第一个点击的单元格):
*..*...**.
....*.....
..c..*....
........*.
..........
点击的单元格附近没有地雷,所以当它被揭开时,它变成 0,它的 8 个相邻单元格也被揭开。此过程继续进行,产生以下板:
*..*...**.
1112*.....
00012*....
00001111*.
00000001..
此时,还有未揭开的不包含地雷的单元格(用'.'字符表示),因此玩家必须再次点击才能继续游戏。
您想尽快赢得比赛。没有什么比一键获胜更快的了。给定棋盘的大小 (R x C) 和隐藏地雷的数量 M,是否有可能(尽管不太可能)一次点击获胜?您可以选择单击的位置。如果可能,请按照“输出”部分中的规范打印任何有效的地雷配置和您点击的坐标。否则,打印“不可能”。
我尝试过的解决方案:
所以对于解决方案,你需要确保每个非矿节点与其他非矿节点在一个 3x3 矩阵中,或者如果节点在网格的边缘,则为 3x2 或 2x2 矩阵;让我们称之为 0Matrix。所以 0Matrix 中的任何节点都有所有非我的邻居。
首先检查是否需要较少的地雷,或者较少的空节点
if(# mines required < 1/3 of total grid size)
// Initialize the grid to all clear nodes and populate the mines
foreach (Node A : the set of non-mine nodes)
foreach (Node AN : A.neighbors)
if AN forms a OMatrix with it's neighbors, continue
else break;
// If we got here means we can make A a mine since all of it's neighbors
// form 0Matricies with their other neighbors
// End this loop when we've added the number of mines required
else
// We initialize the grid to all mines and populate the clear nodes
// Here I handle grids > 3x3;
// For smaller grids, I hard coded the logic, eg: 1xn grids, you just populate in 1 dimension
// Now we know that the # clear nodes required will be 3n+2 or 3n+4
// eg: if a 4x4 grid need 8 clear nodes : 3(2) + 2
For (1 -> num 3's needed)
Add 3 nodes going horizontally
When horizontal axis is filled, add 3 nodes going vertically
When vertical axis is filled, go back to horizontal then vertical and so on.
for(1 -> num 2's needed)
Add 2 nodes going horizontally or continuing in the direction from above
When horizontal axis is filled, add 2 nodes going vertically
例如,假设我们有一个需要 8 个干净节点的 4x4 网格,步骤如下:
// Initial grid of all mines
* * * *
* * * *
* * * *
* * * *
// Populating 3's horizontally
. * * *
. * * *
. * * *
* * * *
. . * *
. . * *
. . * *
* * * *
// Populating 2's continuing in the same direction as 3's
. . . *
. . . *
. . * *
* * * *
另一个例子:需要 11 个清晰节点的 4x4 网格;输出:
. . . .
. . . .
. . . *
* * * *
另一个例子:需要 14 个清晰节点的 4x4 网格;输出:
// Insert the 4 3's horizontally, then switch to vertical to insert the 2's
. . . .
. . . .
. . . .
. . * *
现在这里我们有一个完全填充的网格,如果我们点击 (0, 0) 就可以一键求解。
我的解决方案适用于大多数情况,但没有通过提交(我确实检查了整个 225 个案例输出文件),所以我猜它有一些问题,而且我很确定有更好的解决方案.
最佳答案
让我们首先定义N
,非地雷单元格的数量:
N = R * C - M
一个简单的解决方案是从上到下逐行填充 N
个非地雷单元格区域。 R=5
、C=5
、M=12
示例:
c....
.....
...**
*****
*****
即:
N/C
行。N % C
非地雷填充下一行。只有少数特殊情况是您需要关心的。
如果N=1
,任何配置都是正确的解决方案。
如果 R=1
,只需从左到右填写 N
个非地雷。如果 C=1
,用(单个)非我的填充 N
行。
如果 N
是偶数,则它必须 >= 4。
如果 N
是奇数,则它必须 >= 9。此外,R
和 C
必须 >= 3。
否则无解。
如果 N
是偶数,并且您不能用非地雷填充至少两行,则用 N/2
非地雷填充前两行。
如果 N
是奇数,并且您不能用非地雷填充至少两行,并且不能用 3 个非地雷填充第三行,则用 (N - 3)/2
非地雷,第三行有 3 个非地雷。
如果 N % C = 1
,将最后一个完整行中的最后一个非地雷移动到下一行。
R=5
、C=5
、M=9
的示例:
c....
.....
....*
..***
*****
可以编写一个算法来实现这些规则并在 O(1)
中返回对生成的雷区的描述。当然,绘制网格需要 O(R*C)
。我还根据这些想法用 Perl 编写了一个实现,并被 Code Jam Judge 接受。
关于algorithm - 来自 Google Code Jam(2014)资格赛的扫雷高手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23039471/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!