迷失于试图理解编码中的结构问题

时间:2019-05-17 06:09:47

标签: c++

我有一个小的编码问题,其中涉及在给定为0和1的矩阵的情况下,在被0包围的方阵中找到最大的子方。

我了解计算该最大次方问题的算法。但是我在理解源代码时遇到了麻烦。该结构正在创建正方形,我对结构中的语句和变量(例如size_data_等)的含义感到困惑。

此外,Square s函数中的main()是使用struct Square提供的,因此在与Square s一起使用之前,我必须了解此结构的工作方式方阵中最大的子正方形。

我也不确定如何以给定格式读取矩阵Square s的值。我想改用2D数组表示形式。

要了解outRowoutColoutSizefindSquare()中的含义,我尝试使用cout将它们打印出来,但是我得到了值分别为4197501、0和0。我不知道为什么或如何。

/******************************************************************************
Given a square matrix with values representing pixel colors black (0) and
white (1), implement a function that finds the largest subsquare with all four
borders filled with black pixels. The function should compute three values:
row and column of the top left corner of the subsquare, and its side length.
If no such subsquare exists, the return side length should be set to 0.

Note:
     - Do not change 'findSquare' function signature.
******************************************************************************/

#include <cmath>
#include <memory>
#include <iostream>
using namespace std;

// Square is defined as follows:

struct Square
{
public:
    explicit Square(size_t size) : size_(size), data_(new int[size * size])
    { }

    Square(std::initializer_list<int> init) : size_(init.size()), data_()
    {
        size_ = std::sqrt(init.size());
        if (init.size() != (size_ * size_))
            throw std::invalid_argument("Not enough initializer elements to complete the square");

        data_.reset(new int[size_ * size_]);
        std::move(std::begin(init), std::end(init), &data_[0]);
    }

    int& operator()(size_t row, size_t col)
    {
        if (row >= size_ || col >= size_)
            throw std::out_of_range("OOB");

        return data_[size_ * row + col];
    }

    const int& operator()(size_t row, size_t col) const
    {
        if (row >= size_ || col >= size_)
            throw std::out_of_range("OOB");

        return data_[size_ * row + col];
    }

    size_t Size() const { return size_; }

private:
    size_t size_;
    std::unique_ptr<int[]> data_;
};

void findSquare(const Square& square, size_t& outRow, size_t& outCol, size_t& outSize)
{
    // your code here

    // My code. Trying to understand what outRow, outCol, and outSize represent
    cout << "This is row: " << outRow << '\n';
    cout << "This is col: " << outCol << '\n';
    cout << "This is size: " << outSize << '\n';

}

int main()
{
        Square s
        {
         1, 0, 0, 0,
         1, 0, 0, 0,
         1, 0, 0, 0,
         1, 1, 1, 0
        };

    size_t row, col, size;

    findSquare(s, row, col, size);

}

1 个答案:

答案 0 :(得分:2)

outRow outColoutSize输出参数。当调用函数时,它们没有任何意义(这就是为什么您会得到垃圾值)的原因。计算结果时,您可以在其中分配它们。

outSize = size of largest subsquare
outRow = row of largest subsquare
outCol = column of largest subsquare

对于Square的实现只是一个二维正方形矩阵,您不必了解它是如何工作的,只需了解如何使用它即可。它使用operator()进行索引编制,并使用方法Size进行索引编制。所以你可能会写类似

for (size_t i = 0; i < square.size(); ++i)
{
    for (size_t j = 0; j < square.size(); ++j)
    {
        cout << square(i, j);
    }
    cout << '\n';
}

打印出Square之类的

size_t size;
cin >> size;
Square square(size);
for (size_t i = 0; i < size; ++i)
{
    for (size_t j = 0; j < size; ++j)
    {
        cin >> square(i, j);
    }
}

读入Square