题目地址: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. If three or more candies of the same type are adjacent vertically or horizontally, “crush” them all at the same time - these positions become empty.
  2. After crushing all candies simultaneously, if an empty space on the board has candies on top of itself, then these candies will drop until they hit a candy or bottom at the same time. (No new candies will drop outside the top boundary.)
  3. After the above steps, there may exist more candies that can be crushed. If so, you need to repeat the above steps.
  4. If there does not exist more candies that can be crushed (ie. the board is stable), then return the current board.
  5. You need to perform the above rules until the board becomes stable, then return the current board.

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. The length of board will be in the range [3, 50].
  2. The length of board[i] will be in the range [3, 50].
  3. Each board[i][j] will initially start as an integer in the range [1, 2000].

题目大意

消消乐玩过没有?这就是开始消除至少有三个相连的糖果,一直到达没有糖果可以消除为止。

解题方法

暴力

这个题和炸弹人361. Bomb Enemy有点类似。题目是让从刚开始的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;
}
};

日期

2019 年 9 月 21 日 —— 莫生气,我若气病谁如意

【LeetCode】723. Candy Crush 解题报告 (C++)的更多相关文章

  1. [LeetCode] 723. Candy Crush 糖果消消乐

    This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...

  2. LeetCode 723. Candy Crush

    原题链接在这里:https://leetcode.com/problems/candy-crush/ 题目: This question is about implementing a basic e ...

  3. [LeetCode] 723. Candy Crush 糖果粉碎

    This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...

  4. LeetCode 1 Two Sum 解题报告

    LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...

  5. 【LeetCode】Permutations II 解题报告

    [题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...

  6. 【LeetCode】Island Perimeter 解题报告

    [LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...

  7. 【LeetCode】01 Matrix 解题报告

    [LeetCode]01 Matrix 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/01-matrix/#/descripti ...

  8. 【LeetCode】Largest Number 解题报告

    [LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...

  9. 【LeetCode】Gas Station 解题报告

    [LeetCode]Gas Station 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/gas-station/#/descr ...

随机推荐

  1. 使用mamba加快conda安装软件速度?

    conda是个安装软件的神器,但镜像不稳定,下载安装软件的速度有时很慢.对于几十Mb甚至上百Mb的软件往往下不动,下了半天可能失败. 找了一个叫mamba的加速神器,可以用来并行下载和安装,大大加快速 ...

  2. [R] 如何快速生成许多差异明显的颜色?

    这个需求真的太常见了!注意问题强调的几个关键词:一是快速,二是大量,三是差异明显.在生成大量元素比较图时要明显区分不同样本,比如宏基因组中的物种分析: 方法一:自定义 自定义颜色:优点是选择差异明显的 ...

  3. Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url ...... 解决过程

    2020.3.7准备scrapy,使用anaconda创建一个新的环境,执行"conda create -n scrapyEnv python=3.6",结果出现了"Co ...

  4. linux—查看所有的账号以及管理账号

    用过Linux系统的人都知道,Linux系统查看用户不是会Windows那样,鼠标右键看我的电脑属性,然后看计算机用户和组即可. 那么Linux操作系统里查看所有用户该怎么办呢?用命令.其实用命令就能 ...

  5. python—模拟生成双色球号和大乐透号

    下边这个脚本,比较适合初级学习基本python语法用.但是,不精炼建议可参考https://www.cnblogs.com/Formulate0303/p/14031748.html的写法. 大乐透玩 ...

  6. 4G网络 LTE、 FDD 和TD网络格式区别

    1.LTE是long term evolution的缩写,即长期演进计划,是3GPP组织推出的移动通信3G技术向4G过渡的中间标准,并不是真正意义上的4G通信. 2.FDD是移动通信系统中使用的全双工 ...

  7. 26. Linux GIT

    windows git 下载链接: Msysgit   https://git-scm.com/download/win 1 进入git bash进行第一次配置 git config --global ...

  8. 3.6 String 与 切片&str的区别

    The rust String  is a growable, mutable, owned, UTF-8 encoded string type. &str ,切片,是按UTF-8编码对St ...

  9. Dubbo服务暴露延迟

    Dubbo 2.6.5 版本以后,如果我们的服务启动过程需要warmup事件,就可以使用delay进行服务延迟暴露.只需在服务提供者的<dubbo:service/>标签中添加delay属 ...

  10. 解决PLSQL查不到带中文条件的记录

    原因: PLSQL乱码问题皆是ORACLE服务端字符集编码与PLSQL端字符集编码不一致引起.类似乱码问题都可以从编码是否一致上面去考虑. 解决: 1. 查询Oracle服务端字符集编码,获取NLS_ ...