https://coderun.yandex.ru/problem/black-and-white Легкая

Решение

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter

data class Point(val x: Int, val y: Int)

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val (n, m) = reader.readLine().split(' ').map { it.toInt() }
    val grid = Array(n) { reader.readLine() }

    val adj = mutableMapOf<Point, MutableList<Point>>()
    fun addEdge(p: Point, q: Point) {
        adj.getOrPut(p) { mutableListOf() }.add(q)
        adj.getOrPut(q) { mutableListOf() }.add(p)
    }

    for (i in 0 until n) {
        for (j in 0 until m) {
            when (grid[i][j]) {
                '/' -> {
                    val p1 = Point(j, i + 1)
                    val p2 = Point(j + 1, i)
                    addEdge(p1, p2)
                }
                '\\\\' -> {
                    val p1 = Point(j, i)
                    val p2 = Point(j + 1, i + 1)
                    addEdge(p1, p2)
                }
                else -> { }
            }
        }
    }

    fun edgeKey(a: Point, b: Point): Pair<Point, Point> =
        if (a.x < b.x || (a.x == b.x && a.y < b.y)) Pair(a, b) else Pair(b, a)

    val visitedEdges = mutableSetOf<Pair<Point, Point>>()
    var totalArea = 0L

    for (u in adj.keys) {
        for (v in adj[u]!!) {
            val keyUV = edgeKey(u, v)
            if (keyUV in visitedEdges) continue

            val cycle = mutableListOf<Point>()
            cycle.add(u)
            var prev = u
            var curr = v
            visitedEdges.add(keyUV)
            cycle.add(curr)

            while (curr != u) {
                val neigh = adj[curr]!!
                val next = if (neigh[0] != prev) neigh[0] else neigh[1]
                val keyCN = edgeKey(curr, next)
                visitedEdges.add(keyCN)
                cycle.add(next)
                prev = curr
                curr = next
            }

            var sum = 0L
            for (i in 0 until cycle.size - 1) {
                val p1 = cycle[i]
                val p2 = cycle[i + 1]
                sum += p1.x.toLong() * p2.y - p2.x.toLong() * p1.y
            }
            totalArea += kotlin.math.abs(sum) / 2
        }
    }

    writer.write(totalArea.toString())
    writer.newLine()
    writer.flush()
    writer.close()
    reader.close()
}