C++试图在给定max/min x/y/z值、要在集合中的n个点和要递增的m个值的情况下生成每一组可能的点

C++ Trying to generate every possible set of points given max/min x/y/z values, n number of points to be in set, and m value to increment by

本文关键字:情况下 一组 min max C++ 集合      更新时间:2023-10-16

我之前发布过这个问题,但我觉得我解释得很糟糕。本质上,我想生成所有可能的大小为n的点集,这些点集包含由原点(0,0,0)和用户给定的点(Y1,Y2,Y3)限定的区域内的点,设置值m递增。

例如,如果n是3,m是1,并且(Y1,Y2,Y3)是(1,1,1),则生成的点集将是(每行是一个集):

(0, 0, 0) & (0, 0, 0) & (0, 0, 0)
(0, 0, 0) & (0, 0, 0) & (0, 0, 1)
(0, 0, 0) & (0, 0, 0) & (0, 1, 0)
(0, 0, 0) & (0, 0, 0) & (0, 1, 1)
(0, 0, 0) & (0, 0, 0) & (1, 0, 0)
(0, 0, 0) & (0, 0, 0) & (1, 0, 1)
(0, 0, 0) & (0, 0, 0) & (1, 1, 0)
(0, 0, 0) & (0, 0, 0) & (1, 1, 1)
(0, 0, 0) & (0, 0, 1) & (0, 0, 0)
(0, 0, 0) & (0, 0, 1) & (0, 0, 1)
(0, 0, 0) & (0, 0, 1) & (0, 1, 0)
(0, 0, 0) & (0, 0, 1) & (0, 1, 1)
(0, 0, 0) & (0, 0, 1) & (1, 0, 0)
(0, 0, 0) & (0, 0, 1) & (1, 0, 1)
(0, 0, 0) & (0, 0, 1) & (1, 1, 0)
(0, 0, 0) & (0, 0, 1) & (1, 1, 1)
.......
(1, 1, 1) & (1, 1, 1) & (1, 1, 1)

这是我最初尝试的,但它只是真正为每个单独的点做我想要的事情,而没有找到正确的整体集(点集是已经在主程序中创建的大小为n的点对象的向量,每个点初始化为(0,0,0)):

void allPoints(double Y1, double Y2, double Y3, double precision, vector<Point> pointset)
{
int count = pointset.size()-1;
while (count>=0)
{
while (pointset.at(count).getX()<Y1) //runs through every possible rectangle within rectangle created by given point Y and origin
{
while (pointset.at(count).getY()<Y2)
{
while (pointset.at(count).getZ()<Y3)
{
// insert formula to test each set with here
pointset.at(count).incZ(precision);
}
pointset.at(count).setZ(0);
pointset.at(count).incY(precision);
}
pointset.at(count).setY(0);
pointset.at(count).incX(precision);
}
count--;
}

}

我可以稍后进行,并省略任何包含重复点的集合。最后,我将使用一个特定的公式来遍历和测试每个点集,然后比较所有结果值,但我知道如何做到这一点。

我只有基本的Java/C++经验,在编写正确的循环时遇到了困难,尽管我觉得这里的解决方案很相似,我只是错过了它。我假设在这种情况下我想使用点对象的向量。

如果能帮我找到正确的方向,我将不胜感激。

如果我理解正确,您只是使用Y1、Y2和Y3基数进行计数并存储结果,因此您可以使用大小为n的std::list<unsigned short[3]>,并像使用10基数进行计数一样进行计数(当您达到Y1时,将行重置为0,并将下一行设置为1)。当一个int[3]已满时,您知道需要清空它并转到下一个int[3]。

您需要一个countBase(const unsigned short& base)函数,该函数在循环的每个循环中递增一个值,并在达到base时将其重置,然后递增下一个值。当列表中的每个值都等于Y1、Y2或Y3时,程序结束。

我不知道您打算对此做什么,但您可以在每次执行循环时显示std::list的状态。

别忘了,你正在做的事情很像在你自己的奇怪基地里计数并存储结果,这不应该很难

[编辑]看过你的编辑后,我肯定认为你应该只使用一个循环,一个ushort[3]的容器,一种增加到base的方法,并找到一种保持结果的方法,它会更容易阅读,它应该会给你想要的东西。

[编辑]我认为使用std::list也会更快,对于这种项目,您可能需要一些性能。