https://coderun.yandex.ru/problem/triangles/description | Сложная |
---|
Петя достаточно давно занимается в математическом кружке, поэтому он уже успел изучить не только правила выполнения простейших операций, но и такое достаточно сложное понятие как симметрия. Для того, чтобы получше изучить симметрию, Петя решил начать с наиболее простых геометрических фигур – треугольников. Он скоро понял, что осевой симметрией обладают так называемые равнобедренные треугольники. Поэтому теперь Петя ищет везде такие треугольники.
Напомним, что треугольник называется равнобедренным, если его площадь положительна, и у него есть хотя бы две равные стороны.
Недавно Петя, зайдя в класс, увидел, что на доске нарисовано n точек. Разумеется, он сразу задумался, сколько существует троек из этих точек, которые являются вершинами равнобедренных треугольников.
Требуется написать программу, решающую указанную задачу.
Ввод:
3 0 0 2 2 -2 2Вывод:
1
Ввод:
4 0 0 1 1 1 0 0 1Вывод:
4
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.pow
fun triangles(points: List<Pair<Int, Int>>): Int {
var count = 0
points.forEach { point1 ->
val map = mutableMapOf<Double, MutableList<Pair<Int, Int>>>()
points.forEach { point2 ->
val distance = (point1.first - point2.first).toDouble().pow(2) +
(point1.second - point2.second).toDouble().pow(2)
// Проверяем, есть ли уже точки с таким же расстоянием
if (map.containsKey(distance)) {
map[distance]!!.forEach { point3 ->
// Проверяем, не лежат ли три точки на одной прямой
if ((point3.second - point1.second) * (point2.first - point1.first) !=
(point3.first - point1.first) * (point2.second - point1.second)
) {
count++
}
}
map[distance]!!.add(point2)
} else {
map[distance] = mutableListOf(point2)
}
}
}
return count
}
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val count = reader.readLine().trim().toInt()
val points = List(count) {
reader.readLine()
.trim()
.split(" ")
.map { it.toInt() }
.let { Pair(it[0], it[1]) }
}
val res = triangles(points)
writer.write(res.toString())
writer.newLine()
reader.close()
writer.close()
}