目标
给你一个二维 3 x 3
的矩阵 grid ,每个格子都是一个字符,要么是 'B' ,要么是 'W' 。字符 'W' 表示白色,字符 'B' 表示黑色。
你的任务是改变 至多一个 格子的颜色,使得矩阵中存在一个 2 x 2
颜色完全相同的正方形。
如果可以得到一个相同颜色的 2 x 2
正方形,那么返回 true ,否则返回 false 。
示例 1:
输入:grid = [["B","W","B"],["B","W","W"],["B","W","B"]]
输出:true
解释:
修改 grid[0][2] 的颜色,可以满足要求。
示例 2:
输入:grid = [["B","W","B"],["W","B","W"],["B","W","B"]]
输出:false
解释:
只改变一个格子颜色无法满足要求。
示例 3:
输入:grid = [["B","W","B"],["B","W","W"],["B","W","W"]]
输出:true
解释:
grid 已经包含一个 2 x 2 颜色相同的正方形了。
说明:
- grid.length == 3
grid[i].length == 3
grid[i][j]
要么是 'W' ,要么是 'B' 。
思路
有一个 3 x 3
矩阵,每一个格子有黑白两色,分别用 B W
表示。问能否修改至多一个格子的颜色使矩阵中存在一个 2 x 2
的纯色(颜色相同)矩阵。
可能的 2 x 2
矩阵只有4个,它们有一个公共格子,以它为中心向左上、右上、左下、右下方向判断即可。可以分情况讨论,修改颜色的格子是中间的格子,那么要求其余的三个格子颜色相同。否则,其余格子与中间格子颜色不同的个数最多只能有一个。综上,与中心格子不同的颜色数只能为0、1、3,只需判断不等于2即可。
代码
/**
* @date 2024-08-31 21:28
*/
public class CanMakeSquare3127 {
static private final int[][][] directions = new int[][][]
{
{{-1, 0}, {-1, -1}, {0, -1}},
{{1, 0}, {1, -1}, {0, -1}},
{{-1, 0}, {-1, 1}, {0, 1}},
{{1, 0}, {1, 1}, {0, 1}}
};
public boolean canMakeSquare(char[][] grid) {
char mid = grid[1][1];
for (int[][] direction : directions) {
int cnt = 0;
for (int[] cor : direction) {
if (mid != grid[1 + cor[0]][1 + cor[1]]) {
cnt++;
}
}
if (cnt != 2) {
return true;
}
}
return false;
}
}