找出(x,y)坐标的列表是矩阵中的一行还是列

Find out If a list of (x,y) coordinates span a row or column in a matrix

本文关键字:一行 列表 坐标 找出      更新时间:2023-10-16

所以,我有x,y coordiates的列表。我想找出该坐标列表是否跨越值的矩阵的所有行,而对于列。

即。

T F F F
T T F F
F T F F
F T T F 

在这里,T组作为坐标提供,因此类似于[(0,0),(0,1),(1,1),(1,2),(1,3),(2,3)]。如何使用这些坐标来找出它们描述的集合跨度的所有行?这也适用于列以及两者(因此,该集合是否跨越行和列)。

当前,值存储为vector<vector<coord>>,其中坐标是一个类似的结构:

struct coord {
    int x, int y;
}

假设您所拥有的只是矩阵(m x n = row x column的大小)和在坐标中的T的位置(std::vector<std::vector<coord>>),您可以做:

std::vector<std::vector<coord>> Ts_pos;
std::set<int> rows;
std::set<int> cols;
bool spansRow = false;
bool spansCol = false;
for (int i = 0; i < Ts_pos.size(); i++)
{
   for (int j = 0; j < Ts_pos[i].size(); j++)
   {
      item = Ts_pos[i][j];
      cols.insert(item.x);
      rows.insert(item.y);
   }
}
if (rows.size() == numRows) spansRow = true;
if (cols.size() == numCols) spansCol = true;

执行循环后,两个set将包含行的索引编号和T t触摸的列的索引编号,即:考虑,在您中,在您的范围内,第一个T。它具有坐标(0,0),以便它用索引0触摸列,并带有索引0的行,因此您可以在行集中插入0,在COL集合中插入0。然后,您考虑列表中的第二个t,依此类推。

在循环外,您可以发现是否触摸了所有行,只需查询行集的大小即可。如果它等于矩阵的行数,则至少触摸了所有行,并且T的集合跨越了矩阵。与列集相同。

然后,您可以根据spansRowspansCol的值std::cout

我们可以将所有x坐标和所有y坐标存储在单独的向量中,对这些向量进行排序,然后检查是否来自 0-N 的值每个向量(其中n是X-Vector的n。

缺少值,值范围小于 n ,从大于0开始等值,将为我们提供答案,该设置是否跨越行和列。

您只需要删除x s和 y s,然后将它们与所需的索引进行比较。例如

std::set<int> required = { 0, 1, 2, 3 }; // values that must be present
bool spans_direction(const std::vector<coord> & coords, std::function<int(coord)> projection)
{
  std::set<int> projected;   
  std::transform(coords.begin(), coords.end(), std::inserter(projected, projected.end()), projection);
  return projected == required;
}
bool spans_cols(const std::vector<coord> & coords)
{
  return spans_direction(coords, [](coord c) { return c.x; });
}
bool spans_rows(const std::vector<coord> & coords)
{
  return spans_direction(coords, [](coord c) { return c.y; });
}