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

У меня есть массив из 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 в нижней половине кода.

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

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

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

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

0 голосов
/ 17 декабря 2018

Ваша проблема действительно заключается в утверждении 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]);
}       
...