【发布时间】:2017-10-30 19:10:03
【问题描述】:
我有两个数组,其中填充了 x 和 y 坐标,它们是整数。
现在我想减少数组,这样如果
arrayX[5] = 100 //first occurance of this value
arrayX[6] = 100 //same
arrayX[7] = 100 //same
arrayX[8] = 100 //same
arrayX[9] = 125 //NEW VALUE! Most likely a turn
同时
arrayY[5] = 350 //will be kept due to first entry of this coordinate
arrayY[6] = 375 //will be removed due to X
arrayY[7] = 400 //will be removed due to X
arrayY[8] = 425 //will be removed due to X
arrayY[9] = 450 //Then we proceed to look ahead from here
输出应该是:
(ArrayX[5] = 100, ArrayY[5] = 350)
(ArrayX[8] = 100, ArrayY[8] = 425)
//ArrayX[6] -> ArrayX[7] Will now have been deleted
//proceed to look ahead for new redundant values
在坐标冗余的地方,只应在数组中输入一个条目。
截至目前:我的数组看起来像这样(LIFO):
(X: 450.000000, Y: 300.000000) //Last pos
(X: 425.000000, Y: 300.000000)
(X: 400.000000, Y: 300.000000)
(X: 375.000000, Y: 300.000000)
(X: 350.000000, Y: 300.000000)
(X: 325.000000, Y: 300.000000)
(X: 300.000000, Y: 300.000000)
(X: 275.000000, Y: 300.000000)
(X: 250.000000, Y: 300.000000)
(X: 225.000000, Y: 300.000000)
(X: 200.000000, Y: 300.000000)
(X: 175.000000, Y: 300.000000)
(X: 150.000000, Y: 300.000000)
(X: 125.000000, Y: 300.000000) //First pos
如您所见,关于如何到达目标坐标有很多冗余坐标。
我们只想检查转弯发生的位置(新的值对条目)以及开始和结束坐标。
(有关此内容的进一步视觉解释,请参见下文)
所需的缩减数组(在这种情况下):
(X: 450.000000, Y: 300.000000) //Last pos
(X: 125.000000, Y: 300.000000) //First pos
//all repeating nodes have been removed from the array
图形解释 ● = 最快的方法(数组 (x,y)):
点 ( ● ) 是我们的数组,直观地表示。由于我们的数组包含如上所述的坐标。 X, Y 导致 ● 出现在那个地方
@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
@@@ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @@@
@@@ ! ! ! ! @@@
@@@ ! ! ! ! @@@
@@@ ! ! 14 S 14 ! ! @@@
@@@ ! ! 14 13 ● 13 14 ! ! @@@
@@@ ! ! 14 13 12 ● 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 ● 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 ● 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 ● 9 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 8 ● 8 9 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 8 7 ● 7 8 9 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 8 7 6 ● 6 7 8 9 10 11 12 13 ! ! @@@
@@@ ! ! 13 12 11 10 9 8 7 6 5 ● 5 6 7 8 9 10 11 12 ! ! @@@
@@@ ! ! 12 11 10 9 8 7 6 5 4 ● 4 5 6 7 8 9 10 11 ! ! @@@
@@@ ! ! 11 10 9 8 7 6 5 4 3 ● 3 4 5 6 7 8 9 10 ! ! @@@
@@@ ! ! 10 9 8 7 6 5 4 3 2 ● 2 3 4 5 6 7 8 9 ! ! @@@
@@@ ! ! 9 8 7 6 5 4 3 2 1 G 1 2 3 4 5 6 7 8 ! ! @@@
@@@ ! ! 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 ! ! @@@
@@@ ! ! 11 10 9 8 7 6 5 4 3 2 3 4 5 6 7 8 9 10 ! ! @@@
@@@ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @@@
@@@ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @@@
@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
使用数组缩减:
@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
@@@ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @@@
@@@ ! ! ! ! @@@
@@@ ! ! ! ! @@@
@@@ ! ! 14 S 14 ! ! @@@
@@@ ! ! 14 13 ● 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 8 9 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 8 7 8 9 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 8 7 6 7 8 9 10 11 12 13 14 ! ! @@@
@@@ ! ! 14 13 12 11 10 9 8 7 6 5 6 7 8 9 10 11 12 13 ! ! @@@
@@@ ! ! 13 12 11 10 9 8 7 6 5 4 5 6 7 8 9 10 11 12 ! ! @@@
@@@ ! ! 12 11 10 9 8 7 6 5 4 3 4 5 6 7 8 9 10 11 ! ! @@@
@@@ ! ! 11 10 9 8 7 6 5 4 3 2 3 4 5 6 7 8 9 10 ! ! @@@
@@@ ! ! 10 9 8 7 6 5 4 3 2 ● 2 3 4 5 6 7 8 9 ! ! @@@
@@@ ! ! 9 8 7 6 5 4 3 2 1 G 1 2 3 4 5 6 7 8 ! ! @@@
@@@ ! ! 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 ! ! @@@
@@@ ! ! 11 10 9 8 7 6 5 4 3 2 3 4 5 6 7 8 9 10 ! ! @@@
@@@ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @@@
@@@ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @@@
@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
数组缩减的例外是当我们遇到这样的转折点时:
●
●
●
●
● ● ● ● ●
应该简化为:
●
● ●
当前代码:
当找到目标节点时,计数器会增加,并且坐标存储在该数组计数器位置内。
double arrayX[counter]; //this is where the coordinates are stored
double arrayY[counter]; // -||-
//My attempt at reduction
for(int i=counter; i > 0; i--){ //checking array
for(int j=i;j < counter;j++){
if(arrayY[counter] != arrayY[counter+2] && arrayX[counter] != arrayX[counter+2]){ //IF x != x+2 that means we have a new value at x+1
arrayY[counter] = arrayY[counter+1];
arrayX[counter] = arrayX[counter+1];
counter--;
}
}
}
然而,这只会让我得到第一对,然后在其他任何地方都是 0。
由于我在 APK 环境中工作,因此任何进一步的代码很可能无关紧要。上面的代码是需要根据它们的值进行归约的两个数组。 生成路径的函数代码(sn-p):
while(maxValue != MAP_GOAL){ //while we are not at the goal
n1 = GetCellState(grid,bestCell.i,bestCell.j-1);
n2 = GetCellState(grid,bestCell.i,bestCell.j+1);
n3 = GetCellState(grid,bestCell.i-1,bestCell.j);
n4 = GetCellState(grid,bestCell.i+1,bestCell.j);
if((n1 < maxValue) && (n1 >= 0)){
maxValue = n1;
nextCell.i = bestCell.i;
nextCell.j = bestCell.j-1;
}
if((n2 < maxValue) && (n2 >= 0)){
maxValue = n2;
nextCell.i = bestCell.i;
nextCell.j = bestCell.j+1;
}
if((n3 < maxValue) && (n3 >= 0)){
maxValue = n3;
nextCell.i = bestCell.i-1;
nextCell.j = bestCell.j;
}
if((n4 < maxValue) && (n4 >= 0)){
maxValue = n4;
nextCell.i = bestCell.i+1;
nextCell.j = bestCell.j;
}
Push (Path,nextCell);
bestCell.i = nextCell.i;
bestCell.j = nextCell.j;
bestCell.h_value = 0;
ChangeCellState(grid,bestCell.i,bestCell.j,-9); // mark path with custom sign
counter++;
} //end while
}else{
printf("\nPath was NOT found, terminating...");
exit(1);
} // end if-else
printf("\nPath FOUND!\n");
//expanding the cells
double arrayX[counter];
double arrayY[counter];
/////////////////////////////////////////////////////////////
// THIS IS WHERE THE REDUCTION SHOULD TAKE PLACE //
/////////////////////////////////////////////////////////////
Cell temp;
for(int i=0; i < counter; i++){
temp = Pop(Path);
arrayX[i] = temp.i * CELLSIZE;
arrayY[i] = temp.j * CELLSIZE;
}
for(int i=0;i < (sizeof(arrayX) / sizeof(arrayX[0])); i++){
printf("(X: %f, Y: %f) \n",arrayX[i], arrayY[i]);
}
TL;DR - 当其中一个数组具有多个相同值的条目时,我将如何减少相互链接的数组对。
【问题讨论】:
-
我不明白你的图表解释或 TLDR 版本...
-
@HuStmpHrrr 您能否详细说明究竟是什么您很难理解,我会尝试更详细地解释它:)
-
这可能真的是一个简单的问题,但由于您的自定义对象不完整,而且图表不清楚,所以这篇文章太长了。如果确实可以很容易理解,您可能可以举一个例子,以便更容易理解。
-
@HuStmpHrrr 点 ( ● ) 是我们的数组,直观地表示。由于我们的数组包含如上所述的坐标。 X、Y 导致 ● 出现在那个地方。
-
@HuStmpHrrr 一般问题:减少相同值的多个条目出现两次或更多次。查看顶部的简化数组打印。如您所见,我们连续有多个
Y: 300条目。这不是很有效。因为没有关于这些条目的新信息。总是Y = 300。虽然 X 可能会有所不同,但我只想保留 X 的第一个和最后一个条目,它在 Y 中是配对的,而 Y = 300(查看格式化数组列表中的问题)。