|
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 |