Предыдущий путешественник по этому маршруту оставил вместо карты краткое описание маршрута с направлениями движения и дистанциями. Однако у него на пути были промежуточные точки, из-за чего в описании встречаются тупики. Вам очень хочется вовремя попасть в точку B и не тратить на тупики драгоценное время.
Пример 1
Ввод
LEFT 10
TOP 50
BOTTOM 50
TOP 10
Вывод
LEFT 10
TOP 10
Пример 2
Ввод
TOP 40
RIGHT 10
LEFT 30
BOTTOM 40
Вывод
TOP 40
LEFT 20
BOTTOM 40
Пример 3
Ввод
TOP 42
LEFT 450
TOP 150
BOTTOM 150
RIGHT 450
LEFT 42
Вывод
TOP 42
LEFT 42
Пример 4
Ввод
TOP 50
RIGHT 50
BOTTOM 50
LEFT 50
BOTTOM 10
Вывод
TOP 50
RIGHT 50
BOTTOM 50
LEFT 50
BOTTOM 10
Пример 5
Ввод
TOP 100
TOP 100
Вывод
TOP 200
Пример 6
Ввод
TOP 100
TOP 100
BOTTOM 150
BOTTOM 150
Вывод
BOTTOM 100
Пояснения:
Идея крайне проста: противоположные направления сложить (сделав одно - отрицательным) и вывести получившийся результат.
Так как выход возможен (из-за множества возможных вариантов маршрутов) в нескольких местах, поэтому условий для выхода из циклов расставляем несколько (в этих местах).
fun main() {
// объявление сканнера
val sc = Scanner(System.`in`)
// объявление начальных значений переменных
var z: String = null.toString()
var z1: String = null.toString()
var r: String = null.toString()
var d: String = null.toString()
var k: Int
var i: Int = 0
var o: Int = 0
// Ввод числа строк маршрута
println("Введите число строк n (0<n<1000)")
var n: Int = sc.nextInt()
// ВВод маршрута в массив
println("Введите маршрут построчно: напрвление r (LEFT, RIGHT, TOP, BOTTOM) и дистанцию d (целое число) через пробел.")
var myArray = Array(n, { c -> readLine().toString() })
// Создание массива для "очищенного" маршрута
var route = arrayOf<String>()
// Цикл для двух очищений маршрута
for (q in 1..2) {
var u: Int = 0
// Цикл для работы с каждой строкой маршрута
do {
k = 0
// Цикл для "сложения" направлений LEFT и RIGHT
for (i in u..n - 1) {
// Выход из цикла при завершении маршрута
if (i > n - 1) {
u = i
break
}
// Выделение из строки направления и расстояния и работа с ними
var (r, d) = myArray[i]!!.split(' ')
// LEFT входит в суммирующую переменную к положительным числом
if (r == "LEFT") {
k += d.toInt()
// RIGHT входит в суммирующую переменную к отрицательным числом
} else if (r == "RIGHT") {
k = k - d.toInt()
}
// Выход из цикла при завершении маршрута
if (i >= n - 1) {
u = i
break
}
// Выход из цикла если направление НЕ LEFT и НЕ RIGHT
if (r != "LEFT" && r != "RIGHT") {
u = i
break
}
}
i = u
// результирующее направление в зависимости от знака
if (k > 0) {
z = ("LEFT $k")
} else if (k < 0) {
z = ("RIGHT ${abs(k)}")
}
// Если к значащее (не равно нулю), то заносим в массив route
if (k != 0) {
route += "$z"
// println(z)
}
i = u
// Выход из цикла при завершении маршрута
if (i > n - 1) {
u = i
break
}
k = 0
// Цикл для "сложения" направлений TOP и BOTTOM
for (i in u..n - 1) {
// Выход из цикла при завершении маршрута
if (i > n - 1) {
u = i
break
}
// Выделение из строки направления и расстояния и работа с ними
var (r, d) = myArray[i]!!.split(' ')
// TOP входит в суммирующую переменную к положительным числом
if (r == "TOP") {
k += d.toInt()
// BOTTOM входит в суммирующую переменную к отрицательным числом
} else if (r == "BOTTOM") {
k = k - d.toInt()
}
// Выход из цикла при завершении маршрута
if (i >= n - 1) {
u = i
break
}
// Выход из цикла если направление НЕ TOP и НЕ BOTTOM
if (r != "TOP" && r != "BOTTOM") {
u = i
break
}
}
// результирующее направление в зависимости от знака
if (k > 0) {
z1 = ("TOP $k")
} else if (k < 0) {
z1 = ("BOTTOM ${abs(k)}")
}
// Если к значащее (не равно нулю), то заносим в массив route
if (k != 0) {
route += "$z1"
i = u
// Выход из цикла при завершении маршрута
if (i >= n - 1) {
u = i
break
}
}
k = 0
} while (u <= n - 2)
// Результат первого цикла очищения маршрута
o += 1
for (e in 0..route.size - 1) {
myArray[e] = route[e]
}
// println(route1.toString())
// println(route1.size)
// println("$route")
// }
// Результат очищения маршрута после второго цикла обработки
if (o == 2) {
for (i in 0..route.size) {
println(route[i])
}
}
// задание условий перед вторым заходом
n = route.size
route = arrayOf<String>()
i = 0
}
}
Подписки НЕТ!
Поиск необходимой информации осуществляется в разделах Главного меню по ссылкам.
Уважая чужой опыт, считаю ОБЯЗАТЕЛЬНЫМ наличие «Обратной связи»:
Права на материалы, размещенные на сайте, принадлежат Автору.
Все права защищены и охраняются законом.
При использовании материалов с сайта ссылка на него обязательна.