【发布时间】:2012-03-19 05:12:00
【问题描述】:
您将如何解决在以轴的原点为中心的圆内找到(整数)网格的点的问题,结果按范数排序,如在 C++ 中与中心的距离?
我编写了一个有效的实现(是的,我知道,它的效率极低,但对于我的问题,任何更多的东西都将是矫枉过正的)。我对 C++ 非常陌生,所以我最大的问题是找到一个能够支持
的数据结构- 可排序;
- 能够将数组保存在其中一个元素中,
而不是算法的实现。我的代码如下。提前谢谢大家!
typedef std::pair<int, int[2]> norm_vec2d;
bool norm_vec2d_cmp (norm_vec2d a, norm_vec2d b)
{
bool bo;
bo = (a.first < b.first ? true: false);
return bo;
}
int energy_to_momenta_2D (int energy, std::list<norm_vec2d> *momenta)
{
int i, j, norm, n=0;
int energy_root = (int) std::sqrt(energy);
norm_vec2d temp;
for (i=-energy_root; i<=energy_root; i++)
{
for (j =-energy_root; j<=energy_root; j++)
{
norm = i*i + j*j;
if (norm <= energy)
{
temp.first = norm;
temp.second[0] = i;
temp.second[1] = j;
(*momenta).push_back (temp);
n++;
}
}
}
(*momenta).sort(norm_vec2d_cmp);
return n;
}
【问题讨论】:
-
所有 STL 序列容器 (cplusplus.com/reference/stl) 都是可排序的,因为它们是可迭代的。您可以在其中大多数上使用大多数 std(排序)算法。您始终可以创建一个嵌套容器类型(如
vector< list<int> >或vector< vector<int> >)满足您的其他需求.. -
如果你不希望我们帮助算法,那为什么要标记它“算法”?
-
是否必须在对的后半部分有一个数组?为什么不将 x 坐标存储在
pair::first中,将 y 坐标存储在pair::second中?现在您将norm存储在第一个属性中,但您实际上并不需要存储它,因为您可以随时从 x 和 y 重构它。 -
对不起,我并不是说我不希望对算法有任何帮助,只是这不是我的首要任务:我总是欢迎更智能的解决方案,尤其是考虑到我的解决方案有多不聪明。关于我为什么存储规范,是因为这样我就可以将参数准备好进行排序。
标签: c++ algorithm data-structures discrete-space