Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // MARK: - LINE REFLECTION
- // Идея решения:
- // 1) Убираем наложенные точки
- // 2) Убираем одинаковые X
- // 2) Ищем правильную медиану - для иксов
- // 3) Пробегаемся по множеству точек изначальных и для каждой ищем отраженную помещаяя (с помощью медианы) ее в новое множество
- // 4) Сравниваем изначальное множестов и полученное
- func isReflected(_ points: [[Int]]) -> Bool {
- var set = Set<[Int]>()
- var setX = Set<Int>()
- // 1) Убираем наложенные точки
- for point in points {
- set.insert(point)
- setX.insert(point[0])
- }
- // Надо отсортировать массив иксов
- var arrayX = Array(setX).sorted()
- // 2) Ищем медиану для иксов
- // Если четное кол-во, то берем среднее между двумя центральными элементами ( [-2, -1, 1, 2] -> (-1 + 1)/2 )
- var median: Double
- if arrayX.count % 2 == 0 {
- median = Double( arrayX[arrayX.count/2 - 1] + arrayX[arrayX.count/2] ) / 2
- } else {
- median = Double(arrayX[arrayX.count/2])
- }
- // 3) Для каждой данной ищем отраженную используя медиану и добавляем точки в новое множество
- var reflectedSet = Set<[Int]>()
- for point in set {
- let delta = Double(point[0]) - median
- let reflectedPoint = point[0] - 2 * Int(delta)
- reflectedSet.insert([reflectedPoint, point[1]])
- }
- // 4) Если получились одинаковые множества, то такая отраженная линия есть
- return set == reflectedSet
- }
- //isReflected([[1, 1], [-1, 1], [1, 1]])
- //isReflected([[0, 0], [1, 0]])
- //isReflected([[-1, 2], [1, 0]])
- //isReflected([[1, 1], [5, 3], [2, 5], [4, 5], [2, 3], [4, 1]])
- isReflected([[-1, 3], [2, 4], [2, 4], [5, 3]])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement