刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

包围黑子块

时间限制:1s

内存限制:128mb

(注:input()括号中不允许添加任何提示语)

小张发明了一种新式的棋类游戏——战斗棋。在“战斗棋”中,棋子分为黑、白两色。有一条重要的规则叫做“包围败地”。即,横竖相连的同色棋子算成一块棋,一块棋被对方棋子横竖包围起来就算一块“败地”,棋盘边角也算是包围。

现有一片战斗棋区域,包含N * M(1≤N≤100,1≤M≤100)个落子点,所有落子点均摆满了棋子,其中1代表黑子、0代表白子。

请编写一段程序,计算并输出这片区域中被包围的黑色败地数量。

输入描述:

第一行输入2个正整数N和M(1≤N≤100,1≤M≤100),N表示区域的行数,M表示区域的列数,正整数之间以一个空格隔开

接下来的N行每行包括M个数字(数字只能为1或0),1表示黑子,0表示白子,数字之间以一个空格隔开

输出描述:

输出一个正整数,表示N * M的区域中被包围的黑色败地数量


输入样例:

5 3
1 0 1
0 1 0
0 1 0
1 0 1
0 0 0

输出样例:

5

使用微信搜索喵呜刷题,轻松应对考试!

答案:

```pythondef count_black_defeated_areas(N, M, board):def dfs(i, j):if i < 0 or i >= N or j < 0 or j >= M or board[i][j] != 1:returnboard[i][j] = 2dfs(i - 1, j)dfs(i + 1, j)dfs(i, j - 1)dfs(i, j + 1)def count_defeated_areas():count = 0for i in range(N):for j in range(M):if board[i][j] == 1:dfs(i, j)if all(board[x][j] == 2 for x in range(i - 1, i + 2)) and \all(board[i][y] == 2 for y in range(j - 1, j + 2)):count += 1return countN, M = map(int, input().split())board = [list(map(int, input().split())) for _ in range(N)]return count_defeated_areas()print(count_black_defeated_areas())```

解析:

【喵呜刷题小喵解析】:
本题要求计算并输出一片区域中被包围的黑色败地数量。首先,我们可以定义一个深度优先搜索(DFS)函数,用来将每个黑子的相邻格子标记为2。然后,我们可以遍历整个棋盘,统计标记为2的格子的数量,即被包围的黑子数量。

首先,我们需要读入棋盘的尺寸和每个格子上的棋子。输入样例的第一行表示棋盘的尺寸,接下来的N行每行包括M个数字,1表示黑子,0表示白子。

然后,我们定义一个二维数组board,用于存储棋盘的状态。其中,1表示黑子,0表示白子,2表示被标记的格子。

接着,我们定义DFS函数,用于将每个黑子的相邻格子标记为2。在DFS函数中,我们首先检查当前格子的坐标是否越界,以及当前格子是否为黑子。如果是,我们将当前格子标记为2,并递归地标记其相邻的格子。

最后,我们定义count_defeated_areas函数,用于统计被包围的黑子数量。我们遍历整个棋盘,如果当前格子为黑子,我们调用DFS函数将其相邻的格子标记为2。然后,我们检查当前格子的上下左右四个相邻格子是否都被标记为2,如果是,说明当前格子被包围,我们将计数器count加1。

最后,我们调用count_black_defeated_areas函数,将计算结果打印出来。
创作类型:
原创

本文链接:包围黑子块 时间限制:1s 内存限制:128mb (注:input()括号中不允许添加任何提示语)

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share