[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помощь с алгоритмом
123456
есть двумерный массив(матрица):

0 0 0 0 0 0 0
0 0 2 0 0 0 0
0 2 0 2 0 0 0
0 2 0 2 0 0 0
0 0 2 0 2 0 0
0 0 0 2 0 0 0
0 0 0 0 0 0 0

0 - это пустая клетка
2 - это занятая клетка

Пользователь помечает клетку как занятую, и необходимо определить, имеется ли замкнутый контур для этой поставленной клетки. Если имеется несколько замкнутых контуров, то необходимо найти самый максимальный(чтоб закрывал наибольшее количество клеток).

Подскажите алгоритм.
kaww
гугли по запросу "поиск цикла в графе"
123456
Что-то ничего и не нашел...
Может кто в словах алгоритм опишет
AllesKlar
123456
Где искал?
http://yandex.ru/search/?lr=10405&ymsid=22...%B0%D1%84%D0%B5

_____________
[продано копирайтерам]
123456
Но у меня же матрица, и необходимо найти цикл, который захватывает максимальное кол-во клеток
kaww
Цитата (123456 @ 25.04.2015 - 09:58)
Но у меня же матрица

, которую можно рассматривать как связный граф. Задачу можнго решить поиском в глубину. Т.е. из помеченной клетки запускаешь поиск в глубину (реализации на разных языках можно легко нагуглить или написать самому, там нет ничего сложношо), если удалось вернуться в ту же клетку, то значит замкнутый контур найден. Если есть несколько вариантов, то выбираешь самый неоптимальный (самый длинный путь).
123456
Цитата
то выбираешь самый неоптимальный (самый длинный путь)


Вот тут то и возникают проблемы.
Максимальный путь не означает, что окружает большее количество клеток.

т.е. к примеру есть матрица

0 0 0 0 0 0 0 0 0 0
0 2 2 2 0 0 2 2 2 0
0 2 2 2 0 0 2 0 2 0
0 2 2 2 0 0 2 2 2 0
0 0 0 0 0 0 0 0 0 0

Найдет два цикла. Один состоит из 9 ячеек, а второй из 8.
первый цикл не окружает ни одной клетки, а второй окружает одну. Вот нам второй и нужен
brevis
На правах сумасшедшей идеи могу предложить такой алгоритм (очень тупой):

0. Например, имеем такую иходную матрицу:
0 0 0 0 0 0 0
0 0 2 0 0 0 0
0 2 0 2 0 0 0
0 2 0 2 0 0 0
0 0 2 0 2 0 0
0 0 0 2 0 0 0
0 0 0 0 0 0 0


1. Основной пункт. Я бы даже сказал "хак":
Помечаем все "внешние" клетки, что-бы не мешались. Матрица становится такой:
1 1 1 1 1 1 1
1 1 2 1 1 1 1
1 2 0 2 1 1 1
1 2 0 2 1 1 1
1 1 2 0 2 1 1
1 1 1 2 1 1 1
1 1 1 1 1 1 1
Как сразу все упростилось, да? :)

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

3. И уже по этим индексам "вычисляем" индексы кольца (тупо проверяем граничит ли клетка с двойкой).

Proof of concept: http://jsfiddle.net/c7rpqfnu/

Повторюсь, алгоритм тупой (а может даже частный случай), но на всякий случай я решил им поделиться.

_____________
Чатик в телеге
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.