测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25239. 编程实现:有一块矩形土地被划分成 n 行 m 列的网格,每个网格生长一种植物。如果相邻(上、下、左、右)网格生长的植物相同,那么这些网格的植物归为同一片植物林;如果一个网格与相邻网格生长的植物都不同,那么该网格的植物单独为一片植物林。例如:n = 3,m = 4;3 行 4 列的网格生长的植物如下:一共有 5 片植物林(已用不同颜色的线条圈出),如下图所示:给定 n 行 m 列的网格中生长的植物…

填空题 容易

题目描述

编程实现:

有一块矩形土地被划分成 n 行 m 列的网格,每个网格生长一种植物。如果相邻(上、下、左、右)网格生长的植物相同,那么这些网格的植物归为同一片植物林;如果一个网格与相邻网格生长的植物都不同,那么该网格的植物单独为一片植物林。

例如:n = 3,m = 4;3 行 4 列的网格生长的植物如下:

一共有 5 片植物林(已用不同颜色的线条圈出),如下图所示:

给定 n 行 m 列的网格中生长的植物,请找出一共有多少片植物林。

输入描述:

第一行输入两个整数 n、m(1≤n、m≤100),表示这块矩形土地被划分成的网格行数和列数,整数之间以一个空格隔开;

接下来输入 n 行,每行 m 个整数(1≤整数≤10000),表示每个网格的植物,不同的整数表示不同的植物,相同的整数表示相同的植物,整数之间以一个空格隔开。

输出描述:

输出一个整数,表示这块矩形土地一共有多少片植物林。

样例输入:

3 4
1 2 2 1
1 1 2 1
3 3 3 2

样例输出:

5

参考答案

from collections import deque n, m = map(int, input( ).split( )) grid = [list(map(int, input( ).split( ))) for _ in range(n)] visited = [[False] * m for _ in range(n)] count = 0 directions = [(-1, 0), (0, 1), (1, 0), (0, -1)] for i in range(n): for j in range(m): if not visited[i][j]: count += 1 queue = deque([(i, j)]) visited[i][j] = True plant = grid[i][j] while queue: x, y = queue.popleft( ) for dx, dy in directions: nx, ny = x + dx, y + dy if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and grid[nx][ny] == plant: visited[nx][ny] = True queue.append((nx, ny)) print(count)

答案解析

BFS 遍历网格,对每个未访问点启动搜索,标记连通区域。

相邻且植物相同的点属于同一连通块。

连通块数量即为答案。

上一题 下一题