提高】卫星照片 USACO 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:普及 分数:100 OI排行榜得分:16(0.1*分数+2*难度) 出题人: 描述 农夫约翰总是想要一个农场的地图,所以他拍摄了一张N行M列的卫星照片。一部分的照片看起来像这样: .................. ..#####.......##.. ..#####......##... .................. #.......###.....#. #.....#####....... 他认为每个联通块都是一个谷仓或一头奶牛。联通块由若干个彼此水平或垂直相邻的#符号组成。以下的照片被认为是两个联通块: .... .#.. ..#. .... 农夫约翰认为一个联通块是谷仓,当且仅当它是一个完整的矩形,否则该联通块是一头奶牛。在第一张照片上面,有三个谷仓(大小分别为2x1,2x5和1x1)和两头奶牛。 计算他的卫星照片中谷仓和奶牛的数量。 输入描述 行1:两个空格分隔的整数:N和M(N,M<=80)。
以下是使用Python语言解决此问题的代码: ```python # 定义深度优先搜索函数,用于标记和检查连通块 def dfs(x, y, visited, grid): rows, cols = len(grid), len(grid[0]) # 存储连通块中 # 字符的坐标 positions = [] stack = [(x, y)] while stack: cur_x, cur_y = stack.pop() # 如果越界、已经访问过或者不是 # 字符,跳过 if cur_x < 0 or cur_x >= rows or cur_y < 0 or cur_y >= cols or visited[cur_x][cur_y] or grid[cur_x][cur_y] != '#': continue # 标记为已访问 visited[cur_x][cur_y] = True positions.append((cur_x, cur_y)) # 向四个方向扩展 stack.append((cur_x + 1, cur_y)) stack.append((cur_x - 1, cur_y)) stack.append((cur_x, cur_y + 1)) stack.append((cur_x, cur_y - 1)) # 检查连通块是否为矩形 min_x = min([pos[0] for pos in positions]) max_x = max([pos[0] for pos in positions]) min_y = min([pos[1] for pos in positions]) max_y = max([pos[1] for pos in positions]) for i in range(min_x, max_x + 1): for j in range(min_y, max_y + 1): if grid[i][j] != '#': return False return True # 读取输入 n, m = map(int, input().split()) grid = [input() for _ in range(n)] # 初始化访问标记数组 visited = [[False] * m for _ in range(n)] barns = 0 cows = 0 # 遍历整个网格 for i in range(n): for j in range(m): if grid[i][j] == '#' and not visited[i][j]: if dfs(i, j, visited, grid): barns += 1 else: cows += 1 # 输出结果 print(barns) print(cows) ``` 代码解释: 1. `dfs` 函数:该函数使用深度优先搜索(DFS)来遍历连通块。它接受当前位置 `(x, y)`、访问标记数组 `visited` 和网格 `grid` 作为参数。在 DFS 过程中,将连通块中所有 `#` 字符的坐标存储在 `positions` 列表中。然后,通过计算这些坐标的最小和最大 `x`、`y` 坐标,检查该连通块是否为矩形。如果是矩形,则返回 `True`,否则返回 `False`。 2. 主程序:首先读取输入的行数 `n` 和列数 `m`,以及网格数据。然后初始化访问标记数组 `visited`,用于记录每个位置是否已经被访问过。接着,遍历整个网格,对于每个未访问过的 `#` 字符,调用 `dfs` 函数进行检查。如果返回 `True`,则该连通块是谷仓,`barns` 计数器加 1;否则,该连通块是奶牛,`cows` 计数器加 1。输出谷仓和奶牛的数量。 复杂度分析: - 时间复杂度:$O(N * M)$,其中 $N$ 是行数,$M$ 是列数。因为每个位置最多被访问一次。 - 空间复杂度:$O(N * M)$,主要用于存储访问标记数组。 [2026-02-03 17:15:10 | AI问答 | 850点数解答]
- [字节豆包] 提高】卫星照片 USACO 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:普及 分数:100 OI排行榜得分:16(0.1*分数+2*难度) 出题人: 描述 农夫约翰总是想要一个农场的地图,所以他拍摄了一张N行M列的卫星照片。一部分的照片看起来像这样: .................. ..#####.......##.. ..#####......##... .................. #.......###.....#. #.....#####....... 他认为每个联通块都是一个谷仓或一头奶牛。联通块由若干个彼此水平或垂直相邻的#符号组成。以下的照片被认为是两个联通块: .... .#.. ..#. .... 农夫约翰认为一个联通块是谷仓,当且仅当它是一个完整的矩形,否则该联通块是一头奶牛。在第一张照片上面,有三个谷仓(大小分别为2x1,2x5和1x1)和两头奶牛。 计算他的卫星照片中谷仓和奶牛的数量。 输入描述 行1:两个空格分隔的整数:N和M(N,M<=80)。(850点数解答 | 2026-02-03 17:15:10)7
- [字节豆包] 【提高】Comfortable Cows 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 Farmer Nhoj 的草地可以被看作是一个由正方形方格组成的巨大的二维方阵(想象一个巨大的棋盘)。初始时,草地上是空的。 Farmer Nhoj 将会逐一地将 NN(1≤N≤105)头奶牛加入到草地上。第 ii 头奶牛将会占据方格 (xi,yi),不同于所有已经被其他奶牛占据的方格(0≤xi,yi≤1000)。 一头奶牛被称为是「舒适的」,如果它水平或竖直方向上与恰好三头其他奶牛相邻。然而,太舒适的奶牛往往产奶量落后,所以 Farmer Nhoj 想要额外加入一些奶牛直到没有奶牛(包括新加入的奶牛)是舒适的。注意加入的奶牛的 xx 和 yy 坐标并不一定需要在范围 0…1000内。 对于 1…N 中的每个 i,输出当初始时草地上有奶牛 1…i 时,Farmer Nhoj 为使得没有奶牛舒适,需要加入的奶牛的最小数量。(956点数解答 | 2026-02-02 17:26:13)7
- [字节豆包] 【NOIP2014 基础】螺旋矩阵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1,2,3,...,n 2 ,便构成了一个螺旋矩阵。 下图是一个 n=4 时的螺旋矩阵。 ⎝ ⎜ ⎜ ⎜ ⎛ 1 12 11 10 2 13 16 9 3 14 15 8 4 5 6 7 ⎠ ⎟ ⎟ ⎟ ⎞ 现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。 输入描述 共一行,包含三个整数 n, i, j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。 输出描述 一个整数,表(289点数解答 | 2026-02-02 17:32:56)6
- [DeepSeek] - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内 (571点数解答 | 2025-08-23 20:54:40)192
- [DeepSeek] - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内,并且可以增加新的一样的文本(1317点数解答 | 2025-08-23 20:58:40)197
- [字节豆包] 【例78.3】回文数(Noip1999) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 64MB,其他语言 128MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。 写一个程序,给定一个N(2<N≤10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。 输入描述 第1行,给定一个N(2<N≤10或N=16)表示进制; 第2行,一个N进制数M。 输出描述 最少几步。如果(811点数解答 | 2026-02-02 17:44:17)7
- [字节豆包] [USACO6.1]邮车 Postal Vans 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:普及 分数:100 OI排行榜得分:16(0.1*分数+2*难度) 出题人: 描述 郊区呈矩形,有四条东西方向的街道和N(1<=N<=1000)条南北方向的街道。 在郊区的西北角有一个邮局。 如N=5时,郊区如下图所示,圆点表示邮局,直线表示街道。 每天邮政卡车从邮局出发,每个十字路口(包括边界和四角)经过且只经过一次。现在邮局希望知道邮政货车行驶的路线有几种。 例如,下面两幅图表示的是满足上图的两条路线 另一个例子,下面四幅图表示了当N=3时的全部四种情况 。 输入描述 一行:一个数值N 。 输出描述 一行: 到INPUT中给出的街道的路径总数 。 用例输入 1 4 用例输出 1 12 c++(448点数解答 | 2026-02-03 15:19:59)6
- [字节豆包] [USACO3.2]纺车的轮子 Spinning Wheels 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:普及 分数:100 OI排行榜得分:16(0.1*分数+2*难度) 出题人: 描述 一架纺车有五个纺轮(也就是五个同心圆),这五个不透明的轮子边缘上都有一些缺口。这些缺口必须被迅速而准确地排列好。每个轮子都有一个起始标记(在0度),这样所有的轮子都可以在统一的已知位置开始转动。轮子按照角度变大的方向旋转(即0经过旋转到达1的位置),所以从起始位置开始,在一定的时间内,它们依次转过1度,2度等等(虽然这些轮子很可能不会同时转过这些角度)。 这是一个整数问题。轮子不会转过1.5度或23.51234123度这样的角度。例如,轮子可能在一秒钟内转过20到25度甚至30到40度(如果转得快的话)。 这个问题中的所有角度都限制在 0 <= 角度 <= 359 这个范围内。轮子转过 359 度后接下来就是 0 度。每个轮子都有一个确定的旋转速度,以秒作为单位。1 <= 速度 <= 180。 轮子(857点数解答 | 2026-02-03 15:22:29)5
- [字节豆包] 【基础】Even More Odd Photos 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:基础 分数:100 OI排行榜得分:14(0.1*分数+2*难度) 出题人: 描述 Farmer John 正再一次尝试给他的 N 头奶牛拍照(2≤N≤1000)。 每头奶牛有一个范围在 1…100 之内的整数的「品种编号」。Farmer John 对他的照片有一个十分古怪的构思:他希望将所有的奶牛分为不相交的若干组(换句话说,将每头奶牛分到恰好一组中)并将这些组排成一行,使得第一组的奶牛的品种编号之和为偶数,第二组的编号之和为奇数,以此类推,奇偶交替。 Farmer John 可以分成的最大组数是多少? 输入描述 输入的第一行包含 N。下一行包含 N 个空格分隔的整数,为 N 头奶牛的品种编号。 输出描述 输出 Farmer John 的照片中的最大组数。可以证明,至少存在一种符合要求的分组方案。 用例输入 1 7 1 3 5 7 9 11 13 用例输出 1 3 提示 输入(841点数解答 | 2026-02-03 15:18:32)4
- [字节豆包] 【NOIP2015 基础】扫雷游戏(mine) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。 输入描述 输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。 接下来 n行,每行m 个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。 输出描述 输出文件包含 n 行,每行 m(545点数解答 | 2026-02-02 17:34:02)9
- [字节豆包] 算法提高 夺宝奇兵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 512MB,其他语言 1024MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5->7->8->3->7的顺序,将得到最大值30 输入描述 第一行正整数N(100>=N>1),表示山的高度 接下来有N行非负整数,第i行有i个整数(1<=i<=N),表示山的第i层上从左到右每条路上的珠宝数目 输出描述 一个整数,表示从山底到山顶的所能得到的珠宝的最大数目. 用例输入 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 用例输出 1 30 来源 蓝桥杯练习系统C++(456点数解答 | 2026-02-03 17:12:35)7
- [字节豆包] 算法提高 夺宝奇兵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 512MB,其他语言 1024MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5->7->8->3->7的顺序,将得到最大值30 输入描述 第一行正整数N(100>=N>1),表示山的高度 接下来有N行非负整数,第i行有i个整数(1<=i<=N),表示山的第i层上从左到右每条路上的珠宝数目 输出描述 一个整数,表示从山底到山顶的所能得到的珠宝的最大数目. 用例输入 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 用例输出 1 30 来源 蓝桥杯练习系统C++(649点数解答 | 2026-02-03 17:13:24)6