|   |   | 
| 
 | Задача про лабиринт | ☑ | ||
|---|---|---|---|---|
| 0
    
        k504sa 12.02.17✎ 03:22 | 
        Доброго времени суток всем!
 Имеется задача, у кого какие мысли по ее решению в 1С? // ЗАДАЧА: // Определить количество замкнутых несвязанных между собою пустот (дырок) в лабиринте размера N*M // 1 <= N <= 200, 1 <= M <= 200 // // ВХОД: // Текстовый файл, содержащий массив N*M в виде строк (т.е. N строк, каждая длиной M символов) // Символы: '.' - пусто '#' - занято (стенка лабиринта) // // НУЖНО ПОЛУЧИТЬ: // Число замкнутых несвязанных между собою пустот (дырок) в переданном во входном файле лабиринте. // // ПОЯСНЕНИЕ: // Пустота считается несвязанной с другими, если у неё нет смежных с другой пустотой клеток // по горизонтали или вертикали. Т.е. из одной пустоты нельзя перейти в другую пустоту // двигаясь по любой траектории и делая шаги по горизонтали и/или вертикали. // // Важно! Необходимо учитывать только пустоты, замкнутые стенами лабиринта со всех сторон! // // ВЫХОД: // Вывести исходный файл и под ним - найденное число пустот. // Или вывести сообщение об ошибке, если входной файл некорректен. // // ПОЯСНЯЮЩИЕ ПРИМЕРЫ: // // ###...###. ###...###. // #.##.###.. #1##.###.. // ####...... => ####...... // ......#### ......#### // .###.#...# .###.#222# // .....##### .....##### // // В этом примере у нас 2 (ДВЕ) дырки замкнутые в стенах лабиринта (помечены цифрами '1' и '2'). // // ########## ########## // #..##..### #11##22### // ###.###..# => ###3###44# // #..##.#..# #66##5#44# // ########## ########## // // В этом примере у нас 6 (ШЕСТЬ) дырок. // // #####..... #####..... // ....#..... ....#..... // #####.###. => #####.###. // .....#...# .....#111# // ......###. ......###. // // В этом примере у нас 1 (ОДНА) дырка. Остальные пустоты, хотя из них и нельзя перейти из одной в другую, // не являются дырками, т.к. не замкнуты стенами лабиринта со всех сторон! | |||
| 1
    
        Лодырь 12.02.17✎ 08:04 | 
        Мысль, что задача элементарна, решается быстро и не имеет практического смысла.     | |||
| 2
    
        Лодырь 12.02.17✎ 08:05 | 
        У тебя даже в примерах методика решения приведена, по сути. Надо только закодить.     | |||
| 3
    
        b_ru 12.02.17✎ 08:07 | 
        Модифицированный волновой алгоритм. Находим пустую ячейку, красим ее, затем красим всех соседей, пока есть чего красить. После этого ищем следующую пустую (и некрашенную) и повторяем. Когда пустых больше нет, проверяем сколько использовано цветов - это и есть ответ.     | |||
| 4
    
        k504sa 12.02.17✎ 11:05 | 
        (3) За идею про волновой алгоритм спасибо. Попробую реализовать.     | |||
| 5
    
        Asirius 12.02.17✎ 11:38 | 
        тут на 15 минуть кодить...держи
 Функция ОпределитьКоличествоПустот(Лабиринт) ТекущийЦвет = 0; НовыйЛабиринт = ДобавитьГраницуКЛабиринту(Лабиринт); //Границу и все что с ней рядом красим 1 цветом Для Каждло Клетка Из НовыйЛабиринт Цикл Если КлеткаОкрашенаИлиСтенка(Клетка) Тогда Продолжить; КонецЕсли; ТекущийЦвет = ТекущийЦвет +1; ПокраситьКлетку(Клетка,ТекущийЦвет); Волна = Новый Массив; Волна.Добавить(Клетка); Пока Волна.Количество()>0 Цикл ТекущаяВолнна = Волна; Волна = Новый Массив; Для Каждого КлеткаВолны из ТекущаяВолнна Цикл Для Каждого СоседняяКлетка из СоседиКлетки(КлеткаВолны) Цикл Если Не КлеткаОкрашенаИлиСтенка(СоседняяКлетка) Тогда ПокраситьКлетку(СоседняяКлетка,ТекущийЦвет); Волна.Добавить(СоседняяКлетка); КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; Возврат ТекущийЦвет-1; КонецФункции; | |||
| 6
    
        Asirius 12.02.17✎ 11:50 | 
        Если задачу модифицировать так, что допустим не обход лабиринта, а обход шахматным конем на частично занятой шахматной доске (посчитать, сколько изолированных областей для коня), то у хомячков начинает мозг вскипать..
 А по сути алгоритм будет тотже, надо просто функцию переопределить СоседиКлетки(Клетка) | |||
| 7
    
        k504sa 12.02.17✎ 12:08 | 
        (5) Большое спасибо) вечерком поразбираюсь.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |