- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
题目地址:https://leetcode-cn.com/problems/candy-crush/
This question is about implementing a basic elimination algorithm for Candy Crush.
Given a 2D
integer array board representing the grid of candy, different positive integers board[i][j]
represent different types of candies. A value of board[i][j] = 0
represents that the cell at position (i, j)
is empty. The given board represents the state of the game following the player's move. Now, you need to restore the board to a stable state by crushing candies according to the following rules:
1、 Ifthreeormorecandiesofthesametypeareadjacentverticallyorhorizontally,"crush"themallatthesametime-thesepositionsbecomeempty.;
2、 Aftercrushingallcandiessimultaneously,ifanemptyspaceontheboardhascandiesontopofitself,thenthesecandieswilldropuntiltheyhitacandyorbottomatthesametime.(Nonewcandieswilldropoutsidethetopboundary.);
3、 Aftertheabovesteps,theremayexistmorecandiesthatcanbecrushed.Ifso,youneedtorepeattheabovesteps.;
4、 Iftheredoesnotexistmorecandiesthatcanbecrushed(ie.theboardisstable),thenreturnthecurrentboard.;
5、 Youneedtoperformtheaboverulesuntiltheboardbecomesstable,thenreturnthecurrentboard.;
Example:
Input:
board =
[[110,5,112,113,114],[210,211,5,213,214],[310,311,3,313,314],[410,411,412,5,414],[5,1,512,3,3],[610,4,1,613,614],[710,1,2,713,714],[810,1,2,1,1],[1,1,2,2,2],[4,1,4,4,1014]]
Output:
[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[110,0,0,0,114],[210,0,0,0,214],[310,0,0,113,314],[410,0,0,213,414],[610,211,112,313,614],[710,311,412,613,714],[810,411,512,713,1014]]
Explanation:
Note:
1、 Thelengthofboardwillbeintherange[3,50].;
2、 Thelengthofboard[i]willbeintherange[3,50].;
3、 Eachboard[i][j]willinitiallystartasanintegerintherange[1,2000].;
消消乐玩过没有?这就是开始消除至少有三个相连的糖果,一直到达没有糖果可以消除为止。
这个题和炸弹人361. Bomb Enemyopen in new window有点类似。题目是让从刚开始的Board就开始同时消除该board下所有的至少三个相连的数字。很显然,我们必须保存下目前可以消除的位置,在把当前的board遍历完成之后,在一起一次性全部消除。具体来说分为三步:
1、 找出行和列中所有相连且相等长度大于三的数字位置(对于每个位置都向四个方向寻找,类似于炸弹人寻找墙壁);
2、 把这些位置的值设置为0(此时如果这些位置不存在,则返回结果);
3、 被消除的这些位置应该被消除掉,所以把上面的数字都向下移(对于每列而言,从下向上查找不为0的数字,放到从下面的倒数位置上);
C++代码如下:
class Solution {
public:
vector<vector<int>> candyCrush(vector<vector<int>>& board) {
const int M = board.size();
const int N = board[0].size();
while (true) {
vector<pair<int, int>> del;
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
if (board[i][j] == 0) continue;
int x0 = i, x1 = i, y0 = j, y1 = j;
while (x0 >= 0 && x0 > i - 3 && board[x0][j] == board[i][j]) x0--;
while (x1 < M && x1 < i + 3 && board[x1][j] == board[i][j]) x1++;
while (y0 >= 0 && y0 > j - 3 && board[i][y0] == board[i][j]) y0--;
while (y1 < N && y1 < j + 3 && board[i][y1] == board[i][j]) y1++;
if (x1 - x0 > 3 || y1 - y0 > 3) {
del.push_back({i, j});
}
}
}
if (del.empty()) break;
for (auto& d : del) {
board[d.first][d.second] = 0;
}
for (int j = 0; j < N; ++j) {
int t = M - 1;
for (int i = M - 1; i >= 0; --i) {
if (board[i][j])
swap(board[i][j], board[t--][j]);
}
}
}
return board;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
2022
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
题目地址:https://leetcode-cn.com/problems/candy-crush/ 题目描述 This question is about implementing a basi
当我在我的复数类中声明 ostream #include #include class complex { public: double getRe(); double gerIm(
我在我的项目中使用 recharts(参见示例),有时在我使用 recahrts 组件的所有页面上出现错误(参见错误),我的应用程序崩溃,然后我重新安装节点模块并开始工作。我使用的是 recharts
我正在开发一个健身/健康 flutter 应用项目。 我的应用程序在 Android 上工作正常,但当我调用位置服务时,应用程序在 ios 中崩溃并立即停止工作。 我在 map View 页面内有一个
由于“Default-568@2x.png”,我遇到了“PNG crush”错误。当我取消选中项目中的压缩 PNG 文件选项时(项目 -> 目标 -> build设置 -> 打包 -> 压缩 PNG
我用 Java Swing 做了一个简单的程序。 如果你开始,导弹从左到右穿过 Canvas ,当你点击 Canvas 时,气球就形成了。 我在两个标签之间创建了 crush 事件。但是,效果不佳。有
如何创建像 candy crush 中那样的动画,例如 link 中所示的启动动画.然后,它们还有弹出按钮动画和开始(粒子爆炸)动画。知道如何在 android 中实现这些东西。我尝试了如下所示的按钮
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我正在开发一个应用程序,我对实现 Candy Crush Saga Type 倒计时生命系统的方法很感兴趣。我的应用程序是在 phonegap 中开发的(因此 html、css jquery 和 jq
我主要在 C/Fotran/numpy 中进行一些数值/物理模拟,我使用 Java(尤其是 Processing 和 jMonkey)只是为了在代码原型(prototype)制作过程中获得一些实时交互
嗨, friend 们,我需要每 30 分钟增加一次生命的倒数计时器。所以我创建了一个倒数计时器,但它只在那个调用上运行。在这里我需要全局运行的定时器。如果在背景中应用或终止任何机构帮助我。 这是我的
我正在尝试为基于 JVM 的语言构建一个 cld3 包装器,使用 Java Abstracted Foreign Function Layer. 我创建了一个小类,将答案从 c++ 库转换为缓冲区。
不久前,我们从 Ceph 集群中删除了两个损坏的 OSD,osd.0 和 osd.8。它们现在从大多数 Ceph 命令中消失了,但仍然以奇怪的设备名称出现在 CRUSH 映射中: # devices
我在 iPhone 和 iPad 中使用 Cocos2d V3 创建了一个类似于 Candy Crush Saga 应用程序的应用程序。我想要糖果上的射线动画。光线应该从不同的方向和不同的距离通过。我
我是一名优秀的程序员,十分优秀!