Categories
VB.NET

Задача: Ship Damage

Описание

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

Визуализация

Ship Damage

Решение

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