我得到了
struct point
{
int x;
int y;
};
和点表:
point tab[MAX];
程序应该从 所以我的函数将是 我的功能应该是肯定的,取我添加的元素数量,Y坐标和X坐标之和。 我将很高兴得到进一步的帮助。
我想到了另一个bool表,我将其作为参数传递,以确定我是否从表中获取值。我的问题仍然是如何实现这一点,我不知道如何开始。tab
返回任何可能的子集对的重心之间的最小距离。子集可以是任何大小(当然> = 1且int
类型,因为我必须返回int
。
我全局设置变量min
(因为在进行递归时我必须将这些值与此min进行比较)int min = 0;
int return_min_distance(int sY, int sX, int number, bool iftaken[])
答案 0 :(得分:1)
我认为你需要一个可以遍历表的所有子集的函数,从无任何东西或现有的迭代器开始。然后代码变得简单:
int min_distance = MAXINT;
SubsetIterator si1(0, tab);
while (si1.hasNext())
{
SubsetIterator si2(&si1, tab);
while (si2.hasNext())
{
int d = subsetDistance(tab, si1.subset(), si2.subset());
if (d < min_distance)
{
min_distance = d;
}
}
}
SubsetIterators可以是简单的base-2数,能够计数到MAX,其中1位表示子集中的成员资格。是的,它是一个O(N ^ 2)算法,但我认为它必须是。
诀窍是结合递归。对不起,我只是看不出它有什么帮助。如果我能想出使用它的方法,我会编辑我的答案。
更新:我想到了更多,虽然我仍然看不到递归的用途,但我找到了一种方法来简化子集处理。 SubsetIterators可以存储x和y值的预先计算总和,而不是遍历整个表格进行每次距离计算,以便于进行距离计算。然后,在每次迭代时,您减去离开子集的值并添加要加入的值。一个简单的位和操作可以揭示这些。为了更高效,您可以使用gray coding而不是两个补码来存储成员资格位图。这将保证在每次迭代时恰好一个值进入和/或离开子集。最小的工作。