复制
收藏
提问
简洁
杜老师非常喜欢玩一种叫做“美术馆”的数字游戏,蜗蜗看了之后决定也来试一试,他改编了这个游戏,规则如下: 有一个 n 行 m 列的方格,每一个格子中有一个数,数字为 0 则表示这个地方啥也没有,是空着的,数字为 1 表示这个地方有一盏灯。对于一盏灯,它所在的行和所在的列都能被照亮(包括它自己)例如对于下面这张图: 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 用 (i,j) 表示第 i 行第 j 列的位置。其中 (2,2) 是一盏灯,(3,3) 也是一盏灯。 那么对于 (2,2) 这盏灯来说,(1,2),(2,1),(2,2),(2,3),(2,4),(3,2),(4,2) 都是能被照亮的; 对于 (3,3) 这盏灯来说,(1,3),(2,3),(3,1),(3,2),(3,3),(3,4),(4,3) 都是能被照亮的。 所以最后,亮着的地方是 (1,2),(1,3),(2,1),(2,2),(2,3),(2,4),(3,1),(3,2),(3,3),(3,4),(4,2),(4,3) 这 12 个位置,注意,同时被多盏灯照亮只会统计一次。 请你帮蜗蜗算一算,最后有多少个位置没有被照亮,并输出。 输入格式 第一行,两个正整数 n,m 。 接下来 n 行,每行 m 个数字,表示 n 行 m 列的方格。 输出格式 一行,一个数,表示结果。 样例输入 4 4 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 样例输出 4 数据范围 对于 100% 的数据,保证 1≤n,m≤2×103 , 方格中数字 ∈{0,1} 。c++代码
2个月前
全网
文档
学术
百科
知识库
回答简洁模式
深入研究一些
好的,接下来是解决这个问题的 C++ 代码。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m, 0));
vector<vector<bool>> visited(n, vector<bool>(m, false));
int count = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> grid[i][j];
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (grid[i][j] == 1) {
for (int x = i - 1; x <= i + 1; ++x) {
for (int y = j - 1; y <= j + 1; ++y) {
if (x >= 0 && x < n && y >= 0 && y < m && !visited[x][y]) {
visited[x][y] = true;
count++;
}
}
}
}
}
}
int total = n * m;
cout << total - count << endl;
return 0;
}
这段代码首先读取输入的 n 和 m,然后读取方格中的数字,并存储在一个二维向量中。接着,使用一个二维布尔向量来标记已经被照亮的位置。对于每个位置,如果它包含一盏灯,那么它所在的行和列都会被标记为已访问。最后,计算并输出没有被照亮的位置的数量。
你觉得结果怎么样?