723. Candy Crush

2024-06-22 06:32
文章标签 723 candy crush

本文主要是介绍723. Candy Crush,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://leetcode.com/problems/candy-crush/description/

题目大意:就是消消乐,横竖数字相同且连起来大于3的消掉.
解题思路:暴力法,遍历每个位置,然后检查是否有横竖连续大于3的,有就将该位置记录在to_crash中.然后对 to_crash中的点进行处理,直到to_Crash为空.画图模拟比较好理解.
代码:

class Solution {
public:vector<vector<int>> candyCrush(vector<vector<int>>& board) {int m = board.size();int n = board[0].size();       while (true) {vector<pair<int, int>> to_crash;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (board[i][j]) {  //为了减小计算量,元素为0的略过int i1 = i, i0 = i, j1 = j, j0 = j;  //  i1,i0,j1,j0分别为向下,向上,向右,向左的检测//对每个点(i,j),以其为中心,向上下或左右方向扩展,看是否有连续while (i1 < m && i1 < i+3 && board[i1][j] == board[i][j]) i1++;while (i0 >= 0 && i0 > i-3 && board[i0][j] == board[i][j]) i0--;while (j1 < n && j1 < j+3 && board[i][j1] == board[i][j]) j1++;while (j0 >= 0 && j0 > j-3 && board[i][j0] == board[i][j]) j0--;if (i1-i0 > 3 || j1-j0 > 3) to_crash.push_back({i,j});  //上下或左右连续元素超过3,即符合}}}if (to_crash.empty()) break;for (auto t : to_crash) board[t.first][t.second] = 0;  //重点:将所有标记位置置0for (int j = 0; j < n; j++) {  //由于是自上往下消除,因此外层对j(纵坐标)循环     int t = m-1;  //t用于记录新board的横坐标for (int i = m-1; i >= 0; i--) {  //从下往上,非0元素参与交换,每次交换后t上移if (board[i][j]) swap(board[i][j], board[t--][j]);}}}return board;}
};

这篇关于723. Candy Crush的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083542

相关文章

CF C. Candy Store

原题链接:Problem - C - Codeforces 题意:多测,先给出n代表n种糖果,每种糖果分别给出数量和单价,可以将糖果平均分成若干袋,每一袋的的价格是一袋糖果数量×单价,对于每一种糖果都求出一袋的价格,对于每种糖果都需要用标签贴出一袋的价格,但是如果相邻的糖果价格相同,那么就可以用一个标签来代表价格,问最少使用几个标签。 思路:如果一段糖果价格是一样的,那么设置价格为cost。因

POJ 3083Children of the Candy Corn(DFS*2+BFS)

题目地址:http://poj.org/problem?id=3083 这道题整体思路并不难,但一些细节方面有点难想。。主要是容易写的太麻烦,太乱。。虽然我的代码也比较长,但是思路还是挺清晰的(基本就是把上一段的复制下来稍微改改。。)。但是有些细节方面一开始想错了,导致调试了很长时间。主要思路是记录4个方向然后改变方向走。 题目意思是输出往左绕的步数与往右绕的步数,还有最短步数。前两个用DFS

codeforces #436 A Feed with Candy(贪心)

题目地址:http://codeforces.com/contest/436/problem/A 自己笨的要死。。。WA了好多次,还是看题解才明白了。。。一直在纠结该先选0好还是先选1好,但是就是没想到可以枚举这两种情况都试一试。。。 分别枚举这两种情况,然后每次选的时候从另一种糖果里从可以够到的糖果里选出m最大的那个,贪心就可以了。 代码如下: #include <iostream>

Codeforces 400C Inna and Huge Candy Matrix(模拟)

题目链接:Codeforces 400C Inna and Huge Candy Matrix 题目大意:给出n,m,x,y,z和p,表示在一个n*m的矩阵上有p块糖果,给出p块糖果的坐标,然后将整个矩阵顺时针旋转x次,镜像翻转y次,逆时针旋转z次,然后按照顺序输出操作完后糖果的坐标。 解题思路:模拟,注意旋转完,n和m要交换,翻转不用,然后如果纯模拟肯定超时,很容易发现旋转4次等

hdu 5291 Candy Distribution(dp)

题目链接:hdu 5291 Candy Distribution 每次先计算出dp[0],然后根据dp[0]的数值可以用o(1)的复杂度算出dp[1],以此类推。总体复杂度为o(200 * 80000),可以接受。 #include <cstdio>#include <cstring>#include <algorithm>using namespace std;cons

ceph的CRUSH算法的源码分析

原文:http://way4ever.com/?p=123 1 源文件分析 分析的ceph版本是ceph-0.41。 1.1 rule与bucket的关系 http://ceph.newdream.net/wiki/Custom_data_placement_with_CRUSH 1.2 crush目录下的文件 builder.c builder.h crush

ceph的CRUSH数据分布算法介绍

原文:http://way4ever.com/?p=122 CRUSH是ceph的一个模块,主要解决可控、可扩展、去中心化的数据副本分布问题。 1 摘要 随着大规模分布式存储系统(PB级的数据和成百上千台存储设备)的出现。这些系统必须平衡的分布数据和负载(提高资源利用率),最大化系统的性能,并要处理系统的扩展和硬件失效。ceph设计了CRUSH(一个可扩展的伪随机数据分布算法),用在分

POJ 3083 *** Children of the Candy Corn

题意:走迷宫,求一直靠墙向左走和靠墙向右走以及最短路径的长度。 想法:我真是智商感人,写个dfs和bfs都错误多多。一直也没理解到靠墙向左走和靠墙向右走是怎么回事,原来靠墙左走是顺时针走,靠墙右走为逆时针,同时下一点的初始行走方向依赖于前一步到达该点的行走方向。同时从起点到终点向右走等同于从终点到起点向左走。对了,以后保持每天至少ac两道题吧。 代码如下: <div>#

LeetCode--135. Candy

https://leetcode.com/problems/candy/ 解法一: class Solution {public int candy(int[] ratings) {int[] candies=new int[ratings.length];Arrays.fill(candies,1);boolean flag=true;while(flag){flag=false;for(in

POJ 3083--Children of the Candy Corn

题目:这是题目 题意:一个迷宫,从S点走到E点,求一直靠墙向左走和靠墙向右走以及随便走的最短路, 保证数据的合法性,一定会有路。 定义的方向: int x[4] = {0, -1, 0, 1};//左 上 右 下int y[4] = {-1, 0, 1, 0}; 思路:要求靠墙向左走和靠墙向右走,用DFS,求随便走最短路用BFS。该题的比较难的地方是处理方向。