This question is about implementing a basic elimination algorithm for Candy Crush.
Given a 2D integer arrayboard
representing the grid of candy, different positive integersboard[i][j]
represent different types of candies. A value ofboard[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 astable stateby crushing candies according to the following rules:
You need to perform the above rules until the board becomes stable, then return the current board.
Example 1:
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:
class Solution {
public int[][] candyCrush(int[][] board) {
int n = board.length, m = board[0].length;
boolean todo = false;
for (int i = 0; i < n - 2; i++){
for (int j = 0; j < m; j++){
int v = Math.abs(board[i][j]);
if (v != 0 && v == Math.abs(board[i + 1][j]) && v == Math.abs(board[i + 2][j])){
board[i][j] = board[i + 1][j] = board[i + 2][j] = -v;
todo = true;
}
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m - 2; j++){
int v = Math.abs(board[i][j]);
if (v != 0 && v == Math.abs(board[i][j + 1]) && v == Math.abs(board[i][j + 2])){
board[i][j] = board[i][j + 1] = board[i][j + 2] = -v;
todo = true;
}
}
}
// gravity
for (int j = 0; j < m; j++){
int br = n - 1;
for (int i = n - 1; i >= 0; i--){
if (board[i][j] > 0) board[br--][j] = board[i][j];
}
while (br >= 0){
board[br--][j] = 0;
}
}
return todo ? candyCrush(board) : board;
}
}