Задача
С помощью [latex]x_{ij}, i=1,2; j=1,\ldots,n.[/latex] — действительной матрицы на плоскости задано n точек так, что [latex]x_{1j}, x_{2j}[/latex] — координаты [latex]j[/latex] — точки. Точки попарно соединены отрезками. Найти длину наибольшего отрезка.
Тест
n | Матрица [latex]x_{ij}, i=1,2.[/latex] | Длина наибольшего отрезка | Комментарий |
3 |
2 8 4 9 1 5 |
10 | Пройдено |
4 |
6 14 2 1 9 3 8 0 |
13.3417 | Пройдено |
5 |
1 8 4 3 7 2 9 5 0 11 |
11.7047 | Пройдено |
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <iostream> #include <cmath> using namespace std; int main() { double max = 0; int K=2,L,x=0,y=1; cin >> L; int D[K][L]; for (int i = 0; i < K; i++) { for (int j = 0; j < L; j++) { cin>>D[i][j]; } } for (int i = 0; i < L-1; i++) { for (int j = 0; j < L; j++) { double q=sqrt((D[x][i]-D[x][j])*(D[x][i]-D[x][j])+(D[y][i]-D[y][j])*(D[y][i]-D[y][j])); if(q>max) { max=q; } } } for (int i = 0; i < K; i++) { for (int j = 0; j < L; j++) { cout<<D[i][j]<<" "; } cout<<"\n"; } cout<<max; return 0; } |
Ход решения:
- Вводим матрицу построчно (не очень удобно).
- Находим длину наибольшего отрезка.
С помощью вложенных циклов мы находим длины всех отрезков по формуле
[latex] AB=\sqrt{(x_{2}-x_{1})^{2}+(y_{2}-y_{1})^{2}}, A(x_{1},y_{1}), B(x_{2},y_{2}). [/latex] - По алгоритму нахождения максимума находим длину наибольшего отрезка.
- Выводим матрицу.
- Выводим длину наибольшего отрезка.
Ссылка на код
Исправьте, пожалуйста формулу при помощи \ldots вместо многоточия.
Исправил, спасибо.
Хорошо. Теперь разберёмся с отступами.
При наборе текста Вы иногда пользуетесь клавишей табуляции, иногда ставите сколько-то пробелов. Оба способа хороши. Но их нельзя комбинировать в одном файле. Это связано с тем, что количество пробелов в табуляции зависит от настроек редактора или вьювера.
Посмотрите как у Вас пляшут строчки. Исправьте, пожалуйста.
Спасибо за замечание, исправил. Впредь буду с этим аккуратнее.
Хорошо. Теперь программа хорошо читается, давайте смотреть на код.
Если переменная цикла u равна 0, то в какой строке искать элемент D[u-1][y]. Вопрос риторический. Он просто намекает на ошибку в логике программы. Второй вопрос будет про D[u-1][y-1] тем более для у=0.
Стоит поговорить и о тестах. Обычно программист их готовит до того, как напишет программу. В Вашем случае нужно было нарисовать несколько точек на плоскости и найти длины отрезков их соединяющих. Максимальное из полученных значений ввести в тест в качестве ответа. Наверное Вы так и сделали?
Но я не могу понять из трёх точек Вашего теста (2;9) (8;1) (4;5) между какими расстояние равно 10? Я не нашёл. Удивительно, но Ваша программа тоже считает, что должно быть 10.
У меня даже закралось сомнение, что Вы всё сделали честно.
По оформлению.
— Вы пишите «Вводим матрицу построчно (не очень удобно)». Что Вы имеете в виду, что именно неудобно? Как было бы удобно?
— «С помощью циклов мы из координат одной точки вычитаем координаты другой точки.» Смысла этого текста не согласуется с кодом программы. Вычитать с помощью цикла, это что-то другое. Вы совершенно верно вычитает при помощи операции вычитания. Сформулируйте мысль как-то иначе.
— Вы пишите «Точки должны быть соседними, т.к. по условию они соединены попарно». Попарно, означает, что нужно рассмотреть пары точек. У отрезка два конца, вот и выходит пара (т.е. два).
И не придумывайте, в условии не говорится ничего про соседние точки — нужно проверить все сочетания пар точек.
Расстояние 10 между первой и второй точкой.
sqrt((2-8)*(2-8)+(9-1)*(9-1))=sqrt(36+64)=10.
Все исправил. Алгоритм проверяет все пары точек.
Засчитано.
Только поправьте «С помощью вложенных циклов мы находим длины всех отрезков по формуле …»
«По алгоритму нахождения максимума находим длину наибольшего отрезка.»