我有一个小的编码问题,其中涉及在给定为0和1的矩阵的情况下,在被0包围的方阵中找到最大的子方。
我了解计算该最大次方问题的算法。但是我在理解源代码时遇到了麻烦。该结构正在创建正方形,我对结构中的语句和变量(例如size_
,data_
等)的含义感到困惑。
此外,Square s
函数中的main()
是使用struct Square
提供的,因此在与Square s
一起使用之前,我必须了解此结构的工作方式方阵中最大的子正方形。
我也不确定如何以给定格式读取矩阵Square s
的值。我想改用2D数组表示形式。
要了解outRow
和outCol
和outSize
在findSquare()
中的含义,我尝试使用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);
}
答案 0 :(得分:2)
outRow
outCol
和outSize
是输出参数。当调用函数时,它们没有任何意义(这就是为什么您会得到垃圾值)的原因。计算结果时,您可以在其中分配它们。
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
。