给你一个二维整数数组 circles ,其中 circles[i] = [xi, yi, ri] 表示网格上圆心为 (xi, yi) 且半径为 ri 的第 i 个圆,返回出现在 至少一个 圆内的 格点数目 。

    注意:

    格点 是指整数坐标对应的点。
    圆周上的点 也被视为出现在圆内的点。

    示例 1:
    image.png

    输入:circles = [[2,2,1]]
    输出:5
    解释:
    给定的圆如上图所示。
    出现在圆内的格点为 (1, 2)、(2, 1)、(2, 2)、(2, 3) 和 (3, 2),在图中用绿色标识。
    像 (1, 1) 和 (1, 3) 这样用红色标识的点,并未出现在圆内。
    因此,出现在至少一个圆内的格点数目是 5 。
    示例 2:

    输入:circles = [[2,2,2],[3,4,1]]
    输出:16
    解释:
    给定的圆如上图所示。
    共有 16 个格点出现在至少一个圆内。
    其中部分点的坐标是 (0, 2)、(2, 0)、(2, 4)、(3, 2) 和 (4, 4) 。

    提示:

    1 <= circles.length <= 200
    circles[i].length == 3
    1 <= xi, yi <= 100
    1 <= ri <= min(xi, yi)


    1. class Solution {
    2. public int countLatticePoints(int[][] circles) {
    3. //点的坐标在[0, 200]
    4. boolean[][] st = new boolean[210][210];
    5. for (int[] circle : circles) {
    6. int l = circle[0] - circle[2], r = circle[0] + circle[2];
    7. for (int i = l; i <= r; ++i) {
    8. int h = circle[1] - circle[2], d = circle[1] + circle[2];
    9. for (int j = h; j <= d; ++j) {
    10. if (st[i][j]) continue;
    11. if (check(i, j, circle)) st[i][j] = true;
    12. }
    13. }
    14. }
    15. int res = 0;
    16. for (int i = 0; i <= 200; ++i)
    17. for (int j = 0; j <= 200; ++j)
    18. if (st[i][j]) res++;
    19. return res;
    20. }
    21. boolean check(int x, int y, int[] circle) {
    22. if ((circle[0] - x) * (circle[0] - x) + (circle[1] - y) * (circle[1] - y) <= circle[2] * circle[2]) return true;
    23. return false;
    24. }
    25. }