… … …
<х4> <у4>
максимальный маршрут:
<ml> <m2> <m3> <m4>
длина = <mх>
минимальный маршрут:
<n1> <n2> <n3> <n4>
длина = <mn>
Простейший способ решения этой задачи заключается в организации перебора всех замкнутых маршрутов, проходящих через заданные точки и выбора среди минимального и максимального по длине маршрутов.
Программа Алгоритм
¢мин. и макс. маршруты алг «мин. и макс. маршруты»
clsнач
n = 4 п = 4
dim x(n),y(n),r(n,n) dim x(n),y(n),r(n,n)
? «координаты точек» вывод («координаты точек»)
gosub vvdan 'ввод данных ввод-координат-точек
restore mrshrt 'маршруты загрузка-маршрутов
? «маршруты:» вывод («маршруты:»)
mr = 1*2*3mr =1*2*3
mx = 0 тх = 0
for l = 1 to mrот l = 1 до mr
read k1, k2, k3, k4ввод k1, k2, k3, k4
dl = r(kl,k2) + r(k2,k3) dl =r(kl,k2) +r(k2,k3)
d3 = r(k3,k4) + r(k4,kl) d3 = r(k3,k4) +r(k4,k1)
d = dl + d3 d =d1 + d3
? kl; k2; k3; k4, dвывод (k1; k2; k3; k4, d)
if mx = 0 thenесли тх = 0 то
mx = d: mn = d mx = d: mn = d
ml = kl: m2 = k2 ml = k1: m2 = k2
m3 = k3: m4 = k4 m3 = k3: m4 = k4
nl = kl: n2 = k2 n1 = k1: n2 = k2
n3 = k3: n4 = k4 n3 = k3: n4 = k4
elseif d > mx thenинеc d > mx то
mx = d mx = d
ml = kl: m2 = k2 m1 = k1: m2 = k2
m3 = k3: m4 = k4 m3= k3: m4 = k4
elseif d < mn thenинеc d < mn то
mn = d mn = d
nl = kl: n2 = k2 n1 = k1: n2 = k2
n3 = k3: n4 = k4 n3 = k3: n4 = k4
end ifкесли
next 1кцикл
? «максимальный маршрут:» вывод («максимальный маршрут:»)
? ml; m2; m3; m4вывод (m1; m2; m3; m4)
? «длина =»; mxвывод («длина =»; mx)
? «минимальный маршрут:» вывод («минимальный маршрут:»)
? nl; n2; n3; n4вывод (n1; n2; n3; n4)
? «длина =»; mnвывод («длина =»; mn)
endкон
vvdan: 'ввод данных алг «ввод данных»
restore tchksзагрузка-точек
for k = 1 to nот k = 1 до п
read x(k),y(k)ввод x(k),y(k)
? x(k),y(k)вывод x(k),y(k)
next k кцикл
for k = 1 to nот k = 1 до п
for l = 1 to nот l = 1 до п
dx = x(k) - x(l) dx = x(k) - x(l)
dy = y(k) - y(l) dy = y(k) - y(l)
rs = dx*dx + dy*dy rs = dx*dx + dy*dy
r(k,l) = sqr(rs) r(k,l) = sqr(rs)
next 1 кцикл
next k кцикл
returnкон
mrshrt: 'маршруты:
data 1, 2, 3, 4
data 1, 2, 4, 3
data 1, 3, 2, 4
data 1, 2, 4, 3
data 1, 4, 2, 3
data 1, 4, 3, 2
tchks: 'координаты точек
data 0, 0
data 0, 3
data 4, 0
data 4, 3
Результаты выполнения на ЭВМ приведенной программы:
координаты точек:
0 0
03
4 0
4 3
маршруты: длина:
1234 16
1243 14
1324 18
1243 14
1423 18
1 4 3 2 16
максимальный маршрут:
1324
длина =18
минимальный маршрут:
1 24 3
длина = 14
Четвертую задачу можно отнести к геометрическим задачам, решение которых опирается на некоторые геометрические законы и свойства. Эта задача наиболее сложная среди рассмотренных задач из-за необходимости привлечения определенных математических знаний для организации ее решения.
Задача 4. «Ломаная».
Найти все точки самопересечения разноцветной замкнутой линии, заданной на плоскости координатами своих вершин в порядке обхода ломаной. Данные о ломаной представляются таблицей:
х | у |
0 | 1 |
1 | 0 |
0 | 1 |
1 | 1 |
Особенность этой задачи - большое число частных случаев, связанных с возможным вырождением или наложением отрезков ломанной линии. Именно эти ситуации и составляют содержание тестов, на которых большинство программ дают неправильные результаты.
Приведем проверочные тесты:
Tecт1. (Основной случай)
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
Правильные результаты:
точки пересечения
0.5 0.5
Тест2. (Основной случай)
0 | 0 |
0 | 1 |
1 | 1 |
1 | 0 |
Правильные результаты:
точки пересечения:
отсутствуют
Тест3. (Наложение вершины)
0 | 0 |
0 | 1 |
0.5 | 0 |
1 | 1 |
1 | 0 |
Правильные результаты:
точки пересечения
0.5 0
Тест4. (Наложение ребра)
0 | 0 |
0 | 1 |
0.2 | 0 |
0.8 | 0 |
1 | 1 |
1 | 0 |
Правильные результаты:
отрезок пересечения:
[0.2, 0] - [0.8, 0]
Для систематического конструирования алгоритмов и программы необходима разработка сценария диалога и описание метода решения поставленной геометрической задачи.
Сценарий
точек: <n> координаты точек:<k>: <x> <у>
……..точки пересечения:
отрезок: <k> - <k+l>*отрезок: <1> - <1+1>
точка: <х> <у>
………
отсутствуютМетод решения данной задачи может быть основан на вычислении точек пересечения отрезков (х1, у1) - (x2, у2) и (х3, y3) - (х4, y4) как точек пересечения линий, проходящих через заданные отрезки, с помощью системы уравнений:
(y2 – y1)×( x– x1) - (x2 – x1)×(y – у1) = 0;
(у4 – у3)×(x – x3) - (x4 – x3)×(у – y3) = 0.
Решение этих уравнений может быть проведено вычислением определителей D, Dx, Dy приведенной системы уравнений:
(у2 – у1)×х- (х2 – х1)×у = (у2 – y1)×х1 - (x2 – x1)×y1;(у4 – y3)×х - (х4 – х3)×у= (у4 – у3)×х3- (x4 – x3)×y3,
для которой будет справедлив следующий набор расчетных формул:
х = Dx/D;
у = Dy/D;
D = (у2 - у1)×(х4 - x3) - (x2 - x1)×(y4 - y3);
Dx = [(y2 - yl)×xl - (х2 – x1)×y1] - (x4 – х3) - (x2 – x1)×[(y4 – y3)×x3 - (х4 – х3)×y3];
Dy = (у2 - у1)×[(у4 – у3)×х3 - (x4 - x3)×у3] - [(у2 – y1)×x1 - (х2 – x1)×y1]×(y4 – y3).
Факт пересечения пар отрезков может быть установлен из этих же уравнений подстановкой в правые части координат точек альтернативного отрезка и сравнением значений этих выражений. А именно отрезок [(х3, у3) - (х4, у4)] пересекает линию, проходящую через отрезок [(x1,y1) - (х2, у2)], если эти выражения имеют разные знаки:
(у2 - у1)×(х3 – x1) - (х2 – х1)×(y3 – у1) ´ (у2 - у1)×(х4 – x1) - (х2 – x1)×(y4 – y1)£ 0.
Соответственно, отрезок [(х1, у1) - (х2, у2)] пересекает линию, проходящую через отрезок [(х3, у3) - (х4, у4)], если аналогичные выражения имеют разные знаки:
(у4 – у3)×(х1 – х3) - (х4 – х3)×(у1 – у3)´(у4 – у3)×(х2 – х3) - (х4 – х3)×(у2 – у3) £ 0.
И наконец, самый тонкий момент - это частные случаи, когда отрезки ломаной оказываются на одной прямой линии. В этом случае отрезки либо вообще не пересекаются, либо имеют общую часть, которую можно определить из взаимного расположения отрезков на прямой.
В последнем случае общая часть отрезков находится из взаиморасположения отрезков [(х1, у1) - (х2, у2)] и [(х3, у3) - (х4, у4)] на прямой. В данной ситуации взаиморасположение вершин отрезков можно выяснить, вычислив взаиморасположение между ними на прямой относительно отрезка [(х1, у1) - (х2, у2)] по следующим формулам:
d1= 0;
d2= (х2 – х1)×(х2 – х1) + (у2 – у1)×(у2 - 1);