蓝桥杯算法心得——最大连通数(bfs)

大家好,我是晴天学长,bfs基础练习题,虽然是练习题,小伙伴们还是要注意审题哦,是统计bfs的层数还是统计bfs的叶子数,需要的小伙伴请自取哦!


1 )最大连通数

问题描述:小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。
110010000011111110101001001001101010111011011011101001111110
010000000001010001101100000010010110001111100010101100011110
001011101000100011111111111010000010010101010111001000010100
101100001101011101101011011001000110111111010000000110110000
010101100100010000111000100111100110001110111101010011001011
010011011010011110111101111001001001010111110001101000100011
101001011000110100001101011000000110110110100100110111101011
101111000000101000111001100010110000100110001001000101011001
001110111010001011110000001111100001010101001110011010101110
001010101000110001011111001010111111100110000011011111101010
011111100011001110100101001011110011000101011000100111001011
011010001101011110011011111010111110010100101000110111010110
001110000111100100101110001011101010001100010111110111011011
111100001000001100010110101100111001001111100100110000001101
001110010000000111011110000011000010101000111000000110101101
100100011101011111001101001010011111110010111101000010000111
110010100110101100001101111101010011000110101100000110001010
110101101100001110000100010001001010100010110100100001000011
100100000100001101010101001101000101101000000101111110001010
101101011010101000111110110000110100000010011111111100110010
101111000100000100011000010001011111001010010001010110001010
001010001110101010000100010011101001010101101101010111100101
001111110000101100010111111100000100101010000001011101100001
101011110010000010010110000100001010011111100011011000110010
011110010100011101100101111101000001011100001011010001110011
000101000101000010010010110111000010101111001101100110011100
100011100110011111000110011001111100001110110111001001000111
111011000110001000110111011001011110010010010110101000011111
011110011110110110011011001011010000100100101010110000010011
010011110011100101010101111010001001001111101111101110011101
如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,
则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)
组成一个连通分块。
请问矩阵中最大的连通分块有多大?

2) .算法思路

最大连通块数
偏移量

1.用一个字符串数组去接收矩阵
2.建立Queue队列
3.遍历数字矩阵
4.0的直接跳过,1的压入队列,标记数组
5.BFS
while(是否为空)
标记数组(每一次遍历都重新更新)
int ans = 0
int size =
设置一个最大连通数ans(叶子数)
上下左右
是否开枝散叶
ans++;
max = Math.(max.ans);
输出max


3).代码示例

package LanQiaoTest.BFS;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class 最大连通数 {
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, 1, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        //接收矩阵数组
        String[] s;
        int[][] G = new int[30][60];
        int max = 0;
        //快读接收矩阵
        for (int i = 0; i < 30; i++) {
            s = in.readLine().split("");
            for (int j = 0; j < 60; j++) {
                G[i][j] = Integer.parseInt(s[j]);
            }
        }
        for (int i = 0; i < 30; i++) {
            for (int j = 0; j < 60; j++) {
                if (!(G[i][j] == 0)) {
                    max = Math.max(max, bfs(i, j, G));
                }
            }
        }
        System.out.println(max);
    }

    private static int bfs(int x1, int y1, int[][] G) {
        int ans = 1;
        Queue<int[]> queue = new LinkedList<>();
        boolean[][] st = new boolean[30][60];
        st[x1][y1] = true;
        queue.offer(new int[]{x1, y1});
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size-- > 0) {
                int[] curr = queue.poll();
                int a = curr[0], b = curr[1];
                //开枝散叶
                for (int i = 0; i < 4; i++) {
                    int newX = a + dx[i];
                    int newY = b + dy[i];
                    if (newX >= 0 && newX < 30 && newY >= 0 && newY < 60 && G[newX][newY] == 1 && st[newX][newY] == false) {
                        st[newX][newY] = true;
                        queue.offer(new int[]{newX, newY});
                        ans++;
                    }
                }
            }
        }
        return ans;
    }
}


4).总结

  • 理解题意,是统计层数还是统计叶子数。
  • 标记数组的灵活使用。

你可能感兴趣的:(算法,算法,蓝桥杯,宽度优先,java)