полезные советы

Здесь – маленькие «пустячки», облегчающие жизнь и являющиеся основой любой сущности.

OCHEWIDNO.RU

Главная Найти хорошую работу Похудеть до своего веса Комплексы
Быть умным Быть красивым Каких любят мужчины Наслаждаться
Уметь плавать Вкусно готовь Будь здоров Философия жизни
Экономика и финансы Забытые заповеди Наши детки Разное

При изменении ширины экрана (повороте мобильного) - страницу ПЕРЕГРУЗИТЬ!

Н О В О Е

(последние заметки, по дате убывания)

(ПОДРОБНЕЕ: нажать здесь!)
Kotlin сокращение маршрута

Kotlin сокращение маршрута

Условие задачи:

Вам поручили дойти из точки А в точку Б.

Предыдущий путешественник по этому маршруту оставил вместо карты краткое описание маршрута с направлениями движения и дистанциями. Однако у него на пути были промежуточные точки, из-за чего в описании встречаются тупики. Вам очень хочется вовремя попасть в точку 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


Пояснения:

Идея крайне проста: противоположные направления сложить (сделав одно - отрицательным) и вывести получившийся результат.

Так как выход возможен (из-за множества возможных вариантов маршрутов) в нескольких местах, поэтому условий для выхода из циклов расставляем несколько (в этих местах).

Алгоритм записан в комментариях.

 import java.util.*
import kotlin.io.*
import kotlin.math.abs

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


Обратная связь или подписка на обновления

Права на материалы, размещенные на сайте, принадлежат Автору. Все права защищены и охраняются законом. При использовании материалов с сайта ссылка на него обязательна.

весна
Правильный CSS! Правильный CSS!
>