Описание
За дефинирането на диагонала не е от значение реда на въвеждане на двете срещуположни точки, както и самите точки.
Визуализация

Решение
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Imports System.Drawing | |
Module ShipDamage | |
Sub Main() | |
' вход на данни | |
Dim line(10) As Integer | |
For i As Integer = 0 To line.Length - 1 | |
line(i) = Integer.Parse(Console.ReadLine()) | |
Next i | |
' дефиниране на правоъгълник, | |
' с начало долен ляв ъгъл (1) и посока обратна на часовниковата стрелка, | |
' зададен чрез един от диагоналите му | |
Dim S(3) As Point 'масив за точките, дефиниращи върховете на правоъгълника | |
If line(2) - line(0) > 0 And line(3) - line(1) > 0 Then | |
'диагоналът е зададен с точки 1-3 | |
S(0) = New Point(line(0), line(1)) | |
S(1) = New Point(line(2), line(1)) | |
S(2) = New Point(line(2), line(3)) | |
S(3) = New Point(line(0), line(3)) | |
ElseIf line(2) - line(0) > 0 And line(3) - line(1) < 0 Then 'диагоналът е зададен с точки 2-4 S(0) = New Point(line(2), line(1)) S(1) = New Point(line(0), line(1)) S(2) = New Point(line(0), line(3)) S(3) = New Point(line(2), line(3)) ElseIf line(2) - line(0) < 0 And line(3) - line(1) > 0 Then | |
'диагоналът е зададен с точки 4-2 | |
S(0) = New Point(line(0), line(3)) | |
S(1) = New Point(line(2), line(3)) | |
S(2) = New Point(line(2), line(1)) | |
S(3) = New Point(line(0), line(1)) | |
Else | |
'диагоналът е зададен с точки 3-1 | |
S(0) = New Point(line(2), line(3)) | |
S(1) = New Point(line(0), line(3)) | |
S(2) = New Point(line(0), line(1)) | |
S(3) = New Point(line(2), line(1)) | |
End If | |
'дефиниране на катапулти | |
Dim C(2) As Point 'масив за точките, дефиниращи катапултите | |
C(0) = New Point(line(5), line(6)) | |
C(1) = New Point(line(7), line(8)) | |
C(2) = New Point(line(9), line(10)) | |
'дефиниране на хоризонта | |
Dim horizon As Integer = line(4) | |
'щети, нанесени по кораба от катапултите | |
Dim totalDmg As Integer = 0 | |
'превъртане на всички катапулти | |
For i As Integer = 0 To C.Length - 1 | |
'разстояние от катапулта до хоризонта | |
Dim dist = horizon - C(i).Y | |
'координати на точката, дефинираща мишената | |
Dim target = New Point(C(i).X, dist + horizon) | |
'брояч за положителните детерминанти | |
Dim positiveDeterminant As Integer = 0 | |
'флаг за пропуск при отрицателна детерминанта | |
Dim miss As Boolean = False | |
'превъртане върховете на кораба | |
For j As Integer = 0 To S.Length - 1 | |
'определяне на "площта" (детерминантата) | |
Dim area As Integer | |
If j < S.Length - 1 Then | |
area = (0.5) * (S(j + 1).X * target.Y - S(j + 1).Y * target.X - S(j).X * target.Y + S(j).Y * target.X + S(j).X * S(j + 1).Y - S(j).Y * S(j + 1).X) | |
Else | |
area = (0.5) * (S(0).X * target.Y - S(0).Y * target.X - S(j).X * target.Y + S(j).Y * target.X + S(j).X * S(0).Y - S(j).Y * S(0).X) | |
End If | |
'проверяване знака на "площта" (детерминантата) | |
Select Case area Case Is > 0 'положителна "площ" | |
'целта е улучена при 2 <= positiveDeterminant <= 4 positiveDeterminant += 1 | |
Case Is < 0 'отрицателна "площ" | |
'целта е пропусната | |
miss = True | |
Exit For | |
End Select | |
Next j | |
'ако няма пропуск, прибавяме щетите, нанесени по кораба, към общите щети | |
If miss = False Then | |
Select Case positiveDeterminant | |
Case 4 'изстрелът попада в кораба | |
totalDmg += 100 | |
Case 3 'изстрелът попада върху един от ръбовете | |
totalDmg += 50 | |
Case 2 'изстрелът попада върху един от върховете | |
totalDmg += 25 | |
End Select | |
End If | |
Next i | |
'извеждане на резултата | |
Console.WriteLine(String.Format(totalDmg)) | |
End Sub | |
End Module |