大家好,我是晴天学长,bfs基础练习题,虽然是练习题,小伙伴们还是要注意审题哦,是统计bfs的层数还是统计bfs的叶子数,需要的小伙伴请自取哦!
问题描述:小蓝有一个 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 的位置连通的所有位置(包括自己)
组成一个连通分块。
请问矩阵中最大的连通分块有多大?
最大连通块数
偏移量
1.用一个字符串数组去接收矩阵
2.建立Queue队列
3.遍历数字矩阵
4.0的直接跳过,1的压入队列,标记数组
5.BFS
while(是否为空)
标记数组(每一次遍历都重新更新)
int ans = 0
int size =
设置一个最大连通数ans(叶子数)
上下左右
是否开枝散叶
ans++;
max = Math.(max.ans);
输出max
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;
}
}