C ++ if-оператор для максимального значения в массиве, не указывающий на правильный элемент

У меня есть массив из 2500 шагов, предпринятых роботом, каждый шаг в произвольном направлении (вверх, вниз, вправо или влево). Я должен хранить Евклидово расстояние (гипотенуза прямоугольного треугольника) каждого шага от происхождения робота. Нет проблем там.

Я также должен следить за макс. Евклидово расстояние, которое робот достигает, поэтому, если текущее расстояние больше, чем одно из предыдущих, текущее становится новым наибольшим расстоянием. Вот мой код:

int main(){

int steps[2500];
int randDir[2500];
int coords[2] = {0,0};
int path[2500][2];
double eucliDist[2500];
eucliDist[0] = 1;
double maxEucliDist;
double taxiDist;

for (int i = 0; i < 2500; i++){

randDir[i] = rand() % 4;
steps[i] = i + 1;

switch(randDir[i]){
case 0:
coords[0] = coords[0] + 1;
break;

case 1:
coords[1] = coords[1] + 1;
break;

case 2:
coords[0] = coords[0] - 1;
break;

case 3:
coords[1] = coords[1] - 1;
break;
}

eucliDist[i] = sqrt((pow(coords[0],2)) + (pow(coords[1],2)));

if (eucliDist[i] > eucliDist[i-1]){

maxEucliDist = eucliDist[i]; //need to fix this. Not showing true max Euclid. Dist.

taxiDist = abs(coords[0]) + abs(coords[1]);
}

//cout << "Step " << steps[i] << " Euclidian distance from origin is: " << eucliDist[i] <<endl; //check euclidian dist each step

//cout << steps[i] << "\t Coords (" << coords[0] << ", " << coords[1] << ")" << "\n"; //check coords with each step

}

cout << "Final Coordinates: (" << coords[0] << ", " << coords[1] << ")" << endl;
cout << "Maximum Euclidian distance was: " << maxEucliDist << endl;
cout << "'Taxicab' distance is: " << taxiDist << endl;
cin.get();}

Проблема в том, что мой вывод показывает неправильный максимум, как показано во фрагменте моего вывода ниже:

Вывод программы, показывающий неверное максимальное евклидово расстояние

К вашему сведению, расстояние «такси» — это расстояние, которое должен пройти 2-й робот, чтобы добраться до позиции 1-го робота на максимальном расстоянии, если это необходимо (это основание + высота прямоугольного треугольника с момента перемещения по сетке).

Не уверен, что я делаю не так. Может быть, это как-то связано с моим оператором if в нижней половине кода.

Какие-нибудь мысли?

-1

Решение

Ваша проблема — это действительно ваше if-утверждение:

if (eucliDist[i] > eucliDist[i-1]){  // THIS IS WRONG
maxEucliDist = eucliDist[i]; // THIS IS ACTUALLY OK
taxiDist = abs(coords[0]) + abs(coords[1]);
}

Вы сравниваете текущее расстояние с расстоянием в ПРЕДЫДУЩЕМ кадре, а не с максимальным. Вам также нужно инициализировать ваш максимум равен нулю, так как для этого тоже нужно что-то начинать, иначе ваше сравнение будет «текущим» и «мусорным». C ++ делает не инициализировать локальные переменные в ноль.

Ваше новое if-выражение должно быть таким:

if (eucliDist[i] > maxEucliDist){
maxEucliDist = eucliDist[i];
taxiDist = abs(coords[0]) + abs(coords[1]);
}
0

Другие решения

Ваша первая задача — признать, что квадрат положительного числа является монотонной функцией числа. Поэтому прекратите брать эти квадратные корни повсюду (которые трудно оценить компьютеру) и работайте на расстоянии в квадрате, пока не дойдете до отображения окончательного результата.

Тогда вы можете заменить противный pow(x, 2) функции с x * x и работать в целочисленной арифметике. (Примите меры, чтобы избежать переполнения int хоть.). Это будет как минимум на порядок быстрее.

Ваша конкретная проблема — логическая ошибка в том, что вы сравниваете только новое расстояние с предыдущим, а не минимальный, найденный до сих пор.

0

По вопросам рекламы [email protected]