首页 > 解决方案 > 如何检查矩阵的任何行是否包含所有'A'?

问题描述

我一直在尝试这样做,但问题是最终结果总是有问题或缺失。我有很多 if 语句,我想看看是否可以通过使用 for 循环来减少它。

char matrix[3][3] = {
    {'A','A','A'},{'B','A','B'},{'C','A','C'}
};

if (matrix[0][0] == 'A' && matrix[0][1] == 'A' && matrix[0][2] == 'A') {
            cout << "Found!" << endl;
        }

还有更多的 if 语句,我没有把它放在这里,因为它是相同的东西,只是不同的索引。

我试着做一个这样的for循环,

for (int i = 0; i < matrix[0][2]; i++) {
            if (matrix[0][0] == matrix[0][1] && matrix[0][0] == matrix[0][2])
                cout << "Found!" << endl;
            break;
        }

与将近 20 行的 if 语句相比,这看起来更有条理,但它仍然缺少一些部分。例如在数组中和[0][1]所有的都有字符。当同一字符垂直或水平出现在同一行时,如何将其实现到 for 循环中以打印出消息。[1][1][2][1]'A'

标签: c++arraysfor-loopif-statementmultidimensional-array

解决方案


您可以使用标准算法方便地表达这一点:

if (std::any_of(std::begin(matrix), std::end(matrix), 
                [](auto const & row) {
                    return std::all_of(std::begin(row), std::end(row), 
                                       [](char c) {
                                           return c == 'A';
                                       });
                }))
{
    std::cout << "Found";
}

从 C++20 开始,这变得更容易读写:

namespace rs = std::ranges;
if (rs::any_of(matrix, [](auto const & row) {
        return rs::all_of(row, [](char c) {
            return c == 'A';
        });
    }))
{
    std::cout << "Found";
}

这是一个演示


推荐阅读