package org.example.test;

import java.util.*;

public class BFSTest {
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};

    public static void main(String[] args) {
        int[][] test = {{1}};
        System.out.println(solve(test));
    }

    public static int solve(int[][] grid) {
        // write code here
        List<List<Boolean>> visited = new ArrayList<>();
        for (int[] ints : grid) {
            List<Boolean> tmp = new ArrayList<>();
            for (int j = 0; j < ints.length; j++) {
                tmp.add(false);
            }
            visited.add(tmp);
        }
        Queue<int[]> queue = new LinkedList<>();
        int ans = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == 1 && !visited.get(i).get(j)) {
                    queue.offer(new int[]{i, j});
                    ans += BFS(grid, queue, visited);
                }
            }
        }
        return ans;
    }

    /**
     * 如果每次有遍历就说明当前是一个岛屿。
     * 使用队列保存未遍历的节点,节点表示为 int[x][y],
     * 使用visited数组保存遍历过的节点,
     * 当遇到节点为1的时候,如果没有遍历则为一个岛屿,
     * 采用BFS广度有限遍历方式,会把周围为1的节点遍历完,
     * 所有节点遍历完,岛屿就统计出来。
     *
     * @param grid
     * @param queue
     * @param visited
     * @return
     */
    private static int BFS(int[][] grid, Queue<int[]> queue, List<List<Boolean>> visited) {
        int ans = 0;
        while (!queue.isEmpty()) {
            ans++;
            int[] xy = queue.poll();
            visited.get(xy[0]).set(xy[1], true);
            for (int i = 0; i < 4; i++) {
                int x = xy[0] + dx[i];
                int y = xy[1] + dy[i];
                if (!(x >= 0 && y >= 0 && x < grid.length && y < grid[x].length)) {
                    continue;
                }
                if (!visited.get(x).get(y)) {
                    if (grid[x][y] == 1) {
                        int[] tmp = new int[2];
                        tmp[0] = x;
                        tmp[1] = y;
                        queue.offer(tmp);
                    }
                }
            }
        }
        return ans > 0 ? 1 : 0;
    }
}