gpt4 book ai didi

c - 如果同一值连续出现两次,则减少数组长度

转载 作者:行者123 更新时间:2023-12-02 01:07:16 24 4
gpt4 key购买 nike

我有两个数组,其中填充了 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

在坐标冗余的地方,数组中只能有一个条目。

截至目前:我的数组看起来像这样(后进先出):

(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  !   !  @@@
@@@  !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !  @@@
@@@  !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !   !  @@@
@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@

数组归约的异常(exception)情况是当我们遇到这样的转折点时:





● ● ● ● ●

应该减少为:





● ●

当前代码:

当找到目标节点时,计数器递增,坐标存储在该数组计数器位置。

  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 环境中工作,所以任何进一步的代码很可能无关紧要。上面的代码是需要根据它们所具有的值进行归约的两个数组。生成路径的函数代码(片段):

    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 - 当其中一个数组具有多个相同值的条目时,我如何减少彼此链接的数组对。

最佳答案

您可以在一个循环中完成此操作。

//x = [100,100,100,100,125]
//y = [350,375,400,425,450]

int z = 0;
for (int i = 0; i < n; i++) {
if (i == n - 1 || z == 0 || (x[i] != x[i + 1] || x[i] != x[z - 1]) && (y[i] != y[i + 1] || y[i] != y[z - 1])) {
x[z] = x[i];
y[z] = y[i];
z++;
}
}

这应该给你:

//x = [100, 100, 125, 100, 125]
//y = [350, 425, 450, 425, 450]
//z = 3

现在只需删除 indices >= z 的其余元素即可:

//x = [100, 100, 125]
//y = [350, 425, 450]

关于c - 如果同一值连续出现两次,则减少数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47022604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com