首页 > 试题广场 >

挡住洪水

[编程题]挡住洪水
  • 热度指数:2950 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}吴铭市近日洪水肆虐,洪水从地图外部渗入。市政部门在若干方格上砌起围墙,用 `*` 表示。若某片空地区域不与地图边界四联通(上下左右方向),则不会被洪水淹没,视为安全空地。

\hspace{15pt}地图用大小为 x \times y 的字符矩阵描述:`'*'` 表示围墙,`'0'` 表示空地。所有相互四联通的 `'0'` 构成一个区域。请统计所有安全空地格子的数量之和(即所有不与边界四联通的 `'0'` 的总数)。

输入描述:
\hspace{15pt}第一行输入两个整数 x,y\left(1\leqq x,y\leqq 500\right)
\hspace{15pt}接下来 x 行,每行 y 个字符,组成围墙建设图,仅含 `'*'` 与 `'0'`。


输出描述:
\hspace{15pt}输出一个整数,表示所有安全空地格子的总数。
示例1

输入

2 2
**
**

输出

0
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static boolean[][] visit = new boolean[500][500];
    private static int[][] move = new int[][] {{0, 0, 1, -1}, {1, -1, 0, 0}};
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int row = in.nextInt();
        int col = in.nextInt();
        char[][] array = new char[row][col];

        for (int i = 0; i < row; i++) {
            String line = in.next();
            for (int j = 0; j < col; j++) {
                array[i][j] = line.charAt(j);
            }
        }

        int total = 0;
        Queue<int[]> queue = new LinkedList<>();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (!visit[i][j] && array[i][j] == '0' && i > 0 && i < row - 1 && j > 0 &&
                        j < col - 1) {
                    queue.offer(new int[] {i, j});
                    visit[i][j] = true;
                    total += getNum(array, queue, row, col);
                }
            }
        }
        System.out.print(total);
    }

    private static int getNum(char[][] array, Queue<int[]> queue, int row,
                              int col) {
        int num = 1;
        boolean isBlock = true;
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int[] position = queue.poll();
                int px = position[0];
                int py = position[1];

                for (int j = 0; j <= 3; j++) {
                    int newPx = px + move[0][j];
                    int newPy = py + move[1][j];

                    if ((newPx == 0 || newPx == row - 1 || newPy == 0 || newPy == col - 1) &&
                            array[newPx][newPy] == '0') {
                        isBlock = false;
                        continue;
                    }

                    if (newPx > 0 && newPx < row - 1 && newPy > 0 && newPy < col - 1 &&
                            !visit[newPx][newPy] && array[newPx][newPy] == '0') {
                        visit[newPx][newPy] = true;
                        queue.offer(new int[] {newPx, newPy});
                        num++;
                    }
                }
            }
        }
        return isBlock ? num : 0;
    }
}

发表于 2025-12-13 09:26:30 回复(0)