-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTask14.jl
146 lines (116 loc) · 4.39 KB
/
Task14.jl
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#Cодержимое файла robot.jl
function move_back!(r::Robot, side::HorizonSide, num_steps::Int)
while num_steps > 0
move_if_possible!(r, side)
num_steps -= 1
end
end
"""
movements!(r::Robot, side::HorizonSide)
-- Перемещает Робота в заданном направлении до упора
"""
function movements!(r::Robot, side::HorizonSide)
while !isborder(r, side)
move!(r, side)
end
end
"""
movements!(r::Robot, side::HorizonSide, num_steps::Int)
-- Перемещает Робота в заданном направлении на заданное число шагов
"""
function movements!(r::Robot, side::HorizonSide, num_steps::Int)
for i in 1:num_steps
move!(r, side)
end
end
"""
count_movements!(r::Robot, side::HorizonSide)
-- Перемещает Робота в заданном направлении до упора и возвращает сделанное число шагов
"""
function count_movements!(r::Robot, side::HorizonSide)
num_steps = 0
while !isborder(r, side)
move!(r, side)
num_steps += 1
end
return num_steps
end
"""
inverse(side::HorizonSide)
-- Возвращает направление, противоположное заданному
"""
inverse(side::HorizonSide) = HorizonSide(mod(Int(side) + 2, 4))
"""
left(side::HorizonSide)
-- Возвращает направление, следующее, если отсчитывать против часовой стредки, по отношению к заданному
"""
left(side::HorizonSide) = HorizonSide(mod(Int(side) + 1, 4))
"""
right(side::HorizonSide)
-- Возвращает направление, предыдущее, если отсчитывать против часовой стредки, по отношению к заданному
"""
right(side::HorizonSide) = HorizonSide(mod(Int(side) - 1, 4))
"""
move_if_possible!(r::Robot, side::HorizonSide)
-- Перемещает робота в заданном направлении на 1 шаг, если не существует преград
"""
#move_if_possible!(r::Robot, side::HorizonSide) = isborder(r,side) ? (move!(r,side); true) : false
"""
move_if_possible!(r::Robot, side::HorizonSide)::Bool
-- Перемещает Робота в заданном направлении на 1 шаг и возвращает true - это, если мешающей перегородки нет, или, если её можно обойти; имеется ввиду изолированная перегородка прямоугольной формы.
В противном случае Робот остается на месте и функция возвращает false.
"""
# Перемещает робота в заданном направлении, если это возможно, и возвращает true,
# если перемещение состоялось; в противном случае - false.
function move_if_possible!(r::Robot, now_side::HorizonSide)::Bool
# в направлении now_side не встретилось перегородки
if !isborder(r, now_side)
move!(r, now_side)
return true
end
# в направлении now_side есть перегородка => начинается ее обход
left_side = left(now_side)
right_side = inverse(left_side)
num_steps = 0
back_steps = 0
while isborder(r, now_side)
if !isborder(r, left_side)
move!(r, left_side)
num_steps += 1
back_steps += 1
else
movements!(r, right_side, back_steps)
return false # робот пришел в угол
end
end
move!(r, now_side)
back_steps = 0
while isborder(r, right_side)
if !isborder(r, now_side)
move!(r, now_side)
back_steps += 1
else
movements!(r, left_side, back_steps)
return false # робот пришел в угол
end
end
for i in 1:num_steps
move!(r, right_side)
end
return true
end
function mark_kross(r)
for side in 0:3
num = putmarkers!(r, HorizonSide(side))
move_back!(r, inverse(HorizonSide(side)), num)
end
putmarker!(r)
end
function putmarkers!(r::Robot, side::HorizonSide)
num = 0
while move_if_possible!(r, side)
putmarker!(r)
num += 1
end
return num
end