我有一个点x,y的网格,只要新点有更大的x,y或两者,你就可以从一个点移动到一个直接可见的点。我如何在拓扑上对此进行排序?
答案 0 :(得分:2)
这个网格有大量的拓扑排序。但是,其中一些非常容易计算而没有任何空间开销:
希望这有帮助!
答案 1 :(得分:1)
因为这是一个传递关系(即如果你可以从a到b,从b到c,那么你必须能够从a到c)你可以简单地对点进行排序以实现拓扑排序。 / p>
例如,此C代码将通过基于第一个坐标对点进行排序来执行拓扑排序的点数,如果第一个坐标匹配,则执行第二个坐标。
int C[1000][2];
int compar(const void*a,const void*b)
{
int *a2=(int*)a;
int *b2=(int*)b;
int d=a2[0]-b2[0];
if (d)
return d; // Sort on first coordinate
return a2[1]-b2[1]; // Sort on second coordinate
}
...
qsort(C,1000,sizeof(int)*2,compar);
...
对于您的示例(0,0)(1,99)(9,16)(16,9)(36,64)(64,36)(100,100),这些点已根据第一个坐标排序所以这将是qsort调用的输出。
这种方法有效,因为如果你可以从a到b,那么a必须有一个较小的x(因此在列表中较早出现),或者相同的x和较小的y(并且再次出现在排序的前面)列表)。