复制
收藏
提问
简洁

杜老师非常喜欢玩一种叫做“美术馆”的数字游戏,蜗蜗看了之后决定也来试一试,他改编了这个游戏,规则如下: 有一个 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++代码

88a62609e
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,然后读取方格中的数字,并存储在一个二维向量中。接着,使用一个二维布尔向量来标记已经被照亮的位置。对于每个位置,如果它包含一盏灯,那么它所在的行和列都会被标记为已访问。最后,计算并输出没有被照亮的位置的数量。

你觉得结果怎么样?
如何用C++解决“美术馆”数字游戏问题?
C++代码实现点亮方格问题
C++中如何统计未被照亮的方格数?
C++数组操作技巧在“美术馆”游戏中的应用
如何优化C++程序解决方格问题?
C++中二维数组的遍历方法

以上内容由AI搜集生成,仅供参考

在线客服