У меня есть массив из 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 в нижней половине кода.
Какие-нибудь мысли?
Ваша проблема — это действительно ваше 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]);
}
Ваша первая задача — признать, что квадрат положительного числа является монотонной функцией числа. Поэтому прекратите брать эти квадратные корни повсюду (которые трудно оценить компьютеру) и работайте на расстоянии в квадрате, пока не дойдете до отображения окончательного результата.
Тогда вы можете заменить противный pow(x, 2)
функции с x * x
и работать в целочисленной арифметике. (Примите меры, чтобы избежать переполнения int
хоть.). Это будет как минимум на порядок быстрее.
Ваша конкретная проблема — логическая ошибка в том, что вы сравниваете только новое расстояние с предыдущим, а не минимальный, найденный до сих пор.