Skip to content

ana-max/coloring_map

Repository files navigation

Задача: Раскраска карты

Описание: Вход: описание стран на карте множеством отрезков (страна – замкнутая фигура). Выход: минимальное число цветов, необходимое для раскраски данной карты (т.е. 2 соседних страны не могут быть одного цвета), и соответствующая раскраска. Примечание: данная программа предполагает визуализацию.

На вход подаются страны с их регионами. Страны разделяются запятыми и выделются фигурными скобками. Регионы страны также разделяются запятыми и выделяются квадратными скобками. Точки региона раделяются запятыми и пишутся в круглых скобках. В подаваемой на вход строке не должно быть пробелов. Точки в регионах задаются в порядке обхода и их количество должно быть не меньше трех.

Примеры запуска python coloring_map.py -c {[(5,3),(7,3),(5,5)],[(5,5),(7,7),(9,5),(7,3)]},{[(1,1),(4,1),(4,3),(1,3)],[(2,3),(2,5),(5,5),(5,3)],[(4,0),(7,0),(7,3),(4,3)]},{[(9,5),(11,7),(9,9),(7,7)]},{[(8,4),(8,0),(7,0)]},{[(4,8),(4,5),(7,7),(6,9)]},{[(9,7),(12,9),(14,6),(11,5)]} python coloring_map.py -c {color=#191970,[(3,1),(9,2),(3,-6),(3,-5),(1,-5),(1,-2)],[(7,4),(7,6),(9,6),(9,4)]},{[(1,-2),(3,1),(2,3),(-6,0),(-5,-2),(-3,-4)]},{[(1,-2),(-3,-4),(-5,-7),(-3,-10),(3,-6),(3,-5),(1,-5),(1,-2)]},{[(-3,-10),(-8,-12),(-7,-17),(-2,-14)]},{[(12,-5),(14,-9),(11,-12),(8,-8)]},{[(11,-12),(8,-8),(4,-12),(6,-16)]} python coloring_map.py -c {[(3,1),(9,2),(3,-6),(3,-5),(1,-5),(1,-2)],[(7,4),(7,6),(9,6),(9,4)]},{[(1,-2),(3,1),(2,3),(-6,0),(-5,-2),(-3,-4)]},{[(1,-2),(-3,-4),(-5,-7),(-3,-10),(3,-6),(3,-5),(1,-5),(1,-2)]},{[(-3,-10),(-8,-12),(-7,-17),(-2,-14)]},{[(12,-5),(14,-9),(11,-12),(8,-8)]},{[(11,-12),(8,-8),(4,-12),(6,-16)]} python coloring_map.py --generate 3

Как управлять Для того, чтобы нарисовать новую страну, нужно нажать Menu-EditMap и выбрать режим: При нажатии на Edit Online карта будет рисовать в режиме онлайн Как рисовать: Двойной клик - фиксация начала линии, повторный двойной клик - фиксация конца линии Один клик - фиксация точки на карте. Страна рисуется по регионам, как только регион нарисован, нужно нажать Add Region, и рисовать другой, если нужно. Затем, когда все нарисовали и нужно заливать, если хотите задать цвет самостоятельно, нужно нажать на Tools-Choose Color, и затем на Pour. Если не важно, какой цвет, но нажмите на Pour и регион зальется по правилам раскраски. Если страна нарисована и залита, нужно нажать на Save Country Если хотите удалить точку из региона, нужно нажать на страну, в которой надо удалить точку и удалится точка, которая является близжайшей к нажатой, лежащая в этой стране Кликать нужно один раз Как только удаление закончится, нужно нажать на Stop Delete При нажатии Edit Dynamic карта будет редактироваться вбиванием точек Чтобы удалить страну, просто очистите её поле с точками Для сохранения карты, нужно нажать на Menu - Save Map и ввести желаемый файл, для загрузки нажать на Menu-Load Map

Клавиши:
Плюс - приближение
Минус - отдаление
Вправо - подвинуть вправо
Влево - подвинуть влево

Подробности реализации * Вход парсится в модуле parser_countries в классе Parser. На выход он выдаёт словарь с ключом i, где i = 0, ... , (n-1), где n = количество стран и значением - словарь с ключом j, где j = 0, ... , (m-1), где m = количество регионов страны i и значением - точки региона

* В модуле graph, классе Graph строится граф, где вершина - страна, ребро - симметричной бинарное
отношение 'быть соседями'.

Алгоритм: Упорядочиваем вершины по степеням от большей к меньшей. Раскрашиваем первую вершину
и в тот же цвет все, что не смежны с вершиной, окрашенной в этот цвет.
 Когда закончили, берем другую вершину и другой цвет.

Почему данный алгоритм корректный: Алгоритм является корректный, когда он заканчивается
и выдает правильный ответ: в нашем случае - минимальное количество цветов для раскраски карты.
1. Алгоритм очевидно останавливается, потому что количество вершин ограничено
2. Предположим, что алгоритм выдает не верный ответ, т.е. есть ещё меньшее количество цветов,
в которое можно раскрасить граф. Тогда в нашем графе есть вершины с лишним цветом.
Пусть это вершина V и цвет P. Значит вместо P можно испольовать
другой цвет, который уже есть. Пусть это цвет С, P != C. Если вершину V можно окрасить в C,
значит вершины, которые с ней смежны нельзя окрасить в C. Значит, цвет C есть у вершин не смежных с V
Но по нашему алгоритму, получается, что для всякое вершины, не смежной с окрашеной в C,
она должна быть окрашена в C => P = C. противоречие

Почему алгоритм полиномиальный:
Полиномиальный алгоритм - алгоритм, время работы которого не превосходит многочлена от размера данных.
худший случай для работы данного алгоритма: полносязный граф, т.е. все страны соседствуют
и их надо красить в разные цвета, т.е. в n цветов
Лучший случай: пустой граф, т.е. граф, у которого все вершины изолированы, т.е.
нет пересекающихся стран, т.е. надо раскрасить в 1 цвет в 1 цвет
Нужно пройти по всем вершинам и для каждой еще по несмежной с ней. В худшем случае это о-малое
от n^2.

About

Задача "Раскраска карты"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages