【问题标题】:How to check if any row of a matrix contains all 'A's?如何检查矩阵的任何行是否包含所有'A'?
【发布时间】:2021-04-11 17:29:43
【问题描述】:

我一直在尝试这样做,但问题是最终结果总是有问题或缺失。 我有很多 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][1][1][2][1] 中都有字符'A'。 当相同字符垂直或水平出现在同一行时,如何将其实现到for循环中以打印出消息。

【问题讨论】:

  • 你总是可以像bool row_same = true; for(size_t i=0; i&lt;3; i++) { row_same &amp;= matrix[0][i] == 'A'; }一样去处理更复杂的事情。
  • @Joe 手动写出你所有的if 语句——我假设你已经有了它们,只是复制粘贴它们并更改了索引。然后看看索引在你的 if 语句中是如何变化的,例如哪些是从 0 到 2?哪个保持不变?然后将其编码为一个 for 循环。
  • 我敢打赌if you try to explain your for loop to your rubber duck,你的橡皮鸭会用它来解释问题。您是否尝试过向您的橡皮鸭解释您的代码,如果没有,为什么不呢?
  • for (;matrix[0][0] == 'A' &amp;&amp; matrix[0][1] == 'A' &amp;&amp; matrix[0][2] == 'A';)

标签: c++ arrays for-loop if-statement multidimensional-array


【解决方案1】:

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

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";
}

这是demo

【讨论】:

  • 这确实有效,谢谢你。虽然,目前看起来对我来说有点太先进了。
  • @Joe 没关系,你有时间可以学习这些技术。请注意,&lt;algorithm&gt; 是一个非常有用的标头,其中包含许多有用的工具,因此请务必彻底研究它。
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多