Fork me on GitHub

Candy Crush

Description

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

Solution

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
36
37
38
39
40
41
42
43
44
45
46
47
48
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>> del;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 0) continue;
int upper = i + 1, lower = i -1;
int lefter = j - 1, righter = j + 1;
while(upper < m && upper - i < 3
&& board[upper][j] == board[i][j]) ++upper;
while(lower >= 0 && i - lower < 3
&& board[lower][j] == board[i][j]) --lower;
while(righter < n && righter - j < 3
&& board[i][righter] == board[i][j]) ++righter;
while(lefter >= 0 && j - lefter < 3
&& board[i][lefter] == board[i][j]) --lefter;

if (righter -lefter > 3 || upper - lower > 3)
del.push_back(make_pair(i, j));
}
}
if (del.size() == 0) break;

for (auto& item:del) board[item.first][item.second] = 0;

//Begin erasing....
for (int j = 0; j < n; ++j) {
vector<int> temp;
for (int i = m - 1; i >= 0; --i)
if(board[i][j] != 0)
temp.push_back(board[i][j]);

int k = m - 1;
int index = 0;
while(index < temp.size()) {
board[k--][j] = temp[index++];
}
while(k >= 0) board[k--][j] = 0;
}
}
return board;
}
};