class Solution {
public:
vector<vector<int>> colorRed(int n) {
}
};
2647. 把三角形染成红色
现给定你一个整数 n
。考虑一个边长为 n
的等边三角形,被分成 n2
个单位等边三角形。这个三角形有 n
个 从 1 开始编号 的行,其中第 i
行有 2i - 1
个单位等边三角形。
第 i
行的三角形也是 从 1 开始编号 的,其坐标从 (i, 1)
到 (i, 2i - 1)
。下面的图像显示了一个边长为 4
的三角形及其三角形的索引。
如果两个三角形 共享一条边 ,则它们是 相邻 的。例如:
(1,1)
和 (2,2)
是相邻的。(3,2)
和 (3,3)
是相邻的。(2,2)
和 (3,3)
不相邻,因为它们没有共享任何边。初始时,所有单位三角形都是 白色 的。你想选择 k
个三角形并将它们涂成 红色 。然后我们将运行以下算法:
选择最小的 k
并在运行此算法之前将 k
个三角形涂成红色,使得在算法停止后,所有单元三角形都被涂成红色。
返回一个二维列表,其中包含你要最初涂成红色的三角形的坐标。答案必须尽可能小。如果有多个有效的解决方案,请返回其中任意一个。
示例 1 :
输入:n = 3 输出:[[1,1],[2,1],[2,3],[3,1],[3,5]] 解释:初始时,我们选择展示的5个三角形染成红色。然后,我们运行以下算法: - 选择(2,2),它有三个红色相邻的三角形,并将其染成红色。 - 选择(3,2),它有两个红色相邻的三角形,并将其染成红色。 - 选择(3,4),它有三个红色相邻的三角形,并将其染成红色。 - 选择(3,3),它有三个红色相邻的三角形,并将其染成红色。 可以证明,选择任何4个三角形并运行算法都无法将所有三角形都染成红色。
示例 2 :
输入:n = 2 输出:[[1,1],[2,1],[2,3]] 解释:初始时,我们选择图中所示的 3 个三角形为红色。然后,我们运行以下算法: -选择有三个红色相邻的 (2,2) 三角形并将其染成红色。 可以证明,选择任意 2 个三角形并运行该算法都不能使所有三角形变为红色。
提示:
1 <= n <= 1000
原站题解
python3 解法, 执行用时: 120 ms, 内存消耗: 53.3 MB, 提交时间: 2023-10-21 23:04:43
class Solution: def colorRed(self, size: int) -> List[List[int]]: n, res_l = 2 * size, [] for i in range(size, 1, -4): res_l += [[i, j] for j in range(1, n, 2)] if i >= 3: res_l.append([i - 1, 2]) i -= 2 if i >= 2: res_l += [[i, j] for j in range(3, n - 4, 2)] if i >= 3: res_l.append([i - 1, 1]) i -= 2 n -= 8 res_l.append([1, 1]) return res_l
python3 解法, 执行用时: 100 ms, 内存消耗: 53.3 MB, 提交时间: 2023-10-21 23:04:28
class Solution: def colorRed(self, n: int) -> List[List[int]]: res = [[1,1]] p = 0 for r in range(n,1,-1): if p == 0: for c in range(1,r<<1,2): res.append([r,c]) elif p == 1: res.append([r,2]) elif p == 2: for c in range(3,r<<1,2): res.append([r,c]) else: res.append([r,1]) p = (p+1)%4 return res