|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику29.07.2011, 21:59. Показов 10320. Ответов 96
Метки быдлокодерство (Все метки)
Друзья!
Ввиду возникшей необходимости мной был написан класс "рекурсивный обход матрицы"; Теперь задачи на такую тематику будут решаться легко и просто. С меня интерфейс, с вас- мозги. подробнее
Рассмотрим одну из таких задач, на её примере я покажу как надо решать такие задачи и познакомлю с терминами. Вот ей текст
........................................ ........................................ .... 1 Попытка к бегству Время на тест - 3 секунды. Узник пытается бежать из замка, который состоит из MN квадратных комнат, расположенных в виде прямоугольника M?N. Между любыми двумя соседними комнатами есть дверь , однако некоторые комнаты закрыты и попасть в них нельзя. В начале узник находится в угловой комнате и для спасения ему надо попасть в противоположную угловую комнату. Времени у него немного, всего он может побывать не более, чем в M+N-1 комнате, включая начальную и конечную комнату на своем пути, то есть с каждым переходом в соседнюю комнату расстояние до выхода из замка должно уменьшаться. От вас требуется найти количество различных маршрутов, ведущих к спасению. Формат входных данных Первая строчка входных данных содержит натуральные числа M и N, не превосходящих 1000. Далее идет план замка в виде M строчек из N символов в каждой. Один символ соответствует одной комнате: если символ равен 1, то в комнату можно попасть, если он равен 0, то комната закрыта. Первоначальное положение узника - левый нижний угол (первый символ последней строки), выход находится в правом верхнем углу (последний символ первой строки, оба этих символа равны 1). Формат выходных данных Программа должна напечатать количество маршрутов, ведущих узника к выходу и проходящих через M+N-1 комнату, или слово impossible, если таких маршрутов не существует. Входные данные подобраны таким образом, что искомое число маршрутов не превосходит 2.000.000.000. Пример Входные данные 3 5 11111 10101 11111 Выходные данные 3 Входные данные 3 5 11101 10101 10101 Выходные данные impossible ........................................ ........................................ ... ОК, ну что ж, не будем размениваться по мелочам. Я думаю если мы найдём цепочки клеток, по которым из левого нижнего угла можно добраться до правого верхнего, количество цепочек вы найдёте сами. ...Кстати, вот эти цепочки: (4 0) (3 0) (2 0) (1 0) (0 0) (0 1) (0 2) (0 3) (0 4) (4 0) (3 0) (2 0) (2 1) (2 2) (1 2) (0 2) (0 3) (0 4) (4 0) (3 0) (2 0) (2 1) (2 2) (2 3) (2 4) (1 4) (0 4) (4 0) (4 1) (4 2) (3 2) (2 2) (1 2) (0 2) (0 3) (0 4) (4 0) (4 1) (4 2) (3 2) (2 2) (2 3) (2 4) (1 4) (0 4) (4 0) (4 1) (4 2) (4 3) (4 4) (3 4) (2 4) (1 4) (0 4) ........................................ ........................................ .... Для того чтобы найти такие цепочки необходимо прежде всего создать объект класса rek_obhod_matr. Перечисляю по порядку параметры, которые он принимает: собственно матрицу, количество строк, количество столбцов, номер строки и столбца начальной точки. То есть в нашем случае будет такой код:
А взамен получаете вектор векторов пар элементов типа int, каждая пара- координаты очередной точки. Ну то есть вот такую штуку получаете:
++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++ +++ Сосредоточимся на функциях- членах класса Смотрите. Если мы "стоим" в некоторой клетке, объект, созданный нами называется obhod, то её координаты текущие. Их можно найти с помощью функций-членов:
Вернёмся к задаче. Представьте себе, что мы каким-то образом (пока неважно, каким, объяснение позже) "добрались" до клетки, например (1, 0) и стоим в ней. Вопрос: какой путь мы прошли? Правильно, вот он: (4, 0) (3, 0) (2, 0) И возвращается он такой функцией- членом:
(4, 0)(3, 0)(2, 0)(2, 1) или (4, 0) (4, 1) (4, 2) (3, 2) Внимание! Координаты текущей клетки в пройденныё путь не входят! \\\\\\\\\\\\\\\\ Ещё один вектор, который может нам пригодиться- вектор точек, куда мы можем пойти. Допустим, мы стоим в точке (2, 0). Можем пойти в две точки: (1, 0) или (2, 1) Вектор этих пар вернёт нам функция-член
Ещё две полезных функции-члена могут нам пригодиться: Преобразования типа, эта херь позволит перегрузить оператор [][] Это я сам придумал подачи ребят
Это возвращает вектор найденнных путей клеток
++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++ ++++ А теперь сосредоточимся на авторских функциях. 111111111111111 Первая функция-предикат, вот её прототип:
222222222222222222222 Вторая функция-предикат. Необходима для того, чтобы определить- очередной путь закончился или нет? А применительно к нашей задаче- создана ли ЛЮБАЯ из цепочек путей? Прототип у неё попроще будет, принимает просо указатель на объект
!!!Помним, что она пока ещё не занесена в пройденный путь!
3333333333333333333333333 А третья функция изменения. Она нужна для изменения содержания клетки. В данном примере она совсем не нужна. Так как содержимое клеток мы не меняем. Но ниже я приведу пример, когда она нужна. Прототип:
вариант прототипа конструктора
И чтобы никто не кговорил, что вот я лох, подогнал клас под одну задачу, представляю ещё две задачи, решённые таким же способом. Итак, знаменитое заполнение матрицы по спирали, стоим в левом нижнем углу, матрица 6X9 (может быть любая). За содержание функций-предикатов не пинайте, кто может сделать проще пусть напишет проще. Комменты опущу. Тут применяется функция изменения, поскольку мы изменяем клетки, заполняя их числами
Значит, у меня белая шашка это единичка, чёрные двойки, остальные ноли. Всё то же самое. Два предиката, пустое изменение, массив, создание объекта и любование результатом.
В классе есть недостатки, так я например не уверен, что всегда надо передавать матрицу в него и делать там копию. Но я для надёжности передаю всё же. В общем, правьте, уточняйте тестируйте. Говорите чё не так, буду исправлять. РАспространяется по лицензии GPL
0
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 29.07.2011, 21:59 | |
|
Ответы с готовыми решениями:
96
Предлагаю людям класс для написания специфических снимков системы предлагаю людям класс "каждому потоку- своё окно" для тестирования многопоточных приложений.
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
| 30.07.2011, 01:16 | |
|
kravam, много букв и плохого кода. В чем собственно рекурсивность и в чем собвственно обход?
0
|
|
|
Заблокирован
|
|||
| 30.07.2011, 06:50 | |||
|
блин на асме короче можно написать!
0
|
|||
| 30.07.2011, 08:06 | |
|
Не по теме: И да, отучайся уже использовать транслит в идентификаторах
1
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 30.07.2011, 09:05 | |
|
Не по теме: Тут щас будет код Преееелесть! Сууупер прееелесть!
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||
| 30.07.2011, 15:41 [ТС] | |||||
|
Ещё раз: допустим вам необходимо будет решить задачу на рекурсивный обход матрицы. Что это такое я не знаю, в том смысле, что не могу объяснить. Просто иногда задачи такие попадаются. Так вот. Я избавляю всех от проектирования. Скропайте всего три функции и будет вам счастье. Вот дайте мне какую-нибудь задачу на рекурсивный обход и посмотрите как я её решу. И скажите, нужен такой класс или нет. ...Другой вопрос, что задача будет проста, например: заполнить матрицу значениями элементов индексов строк. Можно и мой класс использовать, но это всё равно, что с топором за мухами гоняться. ///////////////////////////////////////////// А в чём плохость кода я так и не понял. Или типа на старых дрожжах решили выехать? Добавлено через 4 минуты
0
|
|||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 30.07.2011, 15:45 | ||
|
Ответь на простой вопрос, что там у тебя рекурсивного? "простой пример с заполнением значений" это итерационная задача. Рекурсия там возможна, но совершенно не к месту. Если ты не можешь привести в пример класс задач, для которых нужно (или можно) использовать твой класс, то он во первых - бесполезен, а во вторых - реализован с ошибками. Если ты не можешь придумать ни одной такой задачи, то ты ни отладить ни протестировать его не можешь, соответственно и о работоспособности речи никакой быть не может. А вообще, есть BGL.
1
|
||
|
Каратель
|
||
| 30.07.2011, 15:49 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 30.07.2011, 15:52 [ТС] | |
|
А класс этот нужен тем, кому по хер на то, как называется задача но кто знает, что она- рекурсивный обход матрицы. Всё. И я действительно крут- я знаю вещи. Правда определение им дать не могу, но прерогативу говорить о названиях вещей я оставляю тебе. Ты-то видать очень хорошо знаешь, что такое рекурсивный обход матрицы...
И алё, там у меня ничего рекурсивного нет. Потому, что рекурсия реализована в КОДЕ КЛАССА. А я его пока не представил.
0
|
|
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
| 30.07.2011, 15:58 | |
|
kravam, нельзя ли более тщательно подбирать выражения? Довольно вольная, полунецензурная речь начинает утомлять.
1
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 30.07.2011, 15:59 | |
|
оК, ты крут. Мы достигли консенсуса.
Сделай в своём классе что либо с матрицей размером 10000х100000 интов. Это всего 1000 мегабайтная матрица. Но что-то мне подсказывает, что в процессе рекурсии ты переполнишь стек гораздо раньше...
1
|
|
|
Заблокирован
|
|
| 30.07.2011, 16:01 | |
Сообщение было отмечено как решение
Решение
3
|
|
|
|
|
| 30.07.2011, 16:04 | |
Сообщение было отмечено как решение
Решение
Единственное, за что автора можно похвалить - это за то, что уже начал осознавать, что некоторые прикладные задачи имеют весьма схожие потроха и для реализации этих потрохов можно выделять общие части и накрывать их интерфейсом.
Реализация этой идеи, как мне кажется, полное г...о. Сужу об этом хотя бы потому, что пример задачи, которая решается с помощью этого универсального интерфейса, как-то плохо состыкуется с необходимостью такого интерфейса. Уже из условия задачи можно понять, что при ограничении в M+N-1 ходов нужно найти пути, в которых перемещения только "вправо" и "вверх", предполагая, что узник слева снизу, а выход справа сверху. Т.е. задачу решать надо перебором кобинаций "вверх" и "вправо", а не перебором матрицы. И решить её "в лоб" будет намного быстрее и понятнее, чем с использованием дополнительного класса. Другими словами, конкретно в данном случае это напоминает вот такой старый прикол: Какой язык лучше учить? Ну и попросту надо помнить инженерное правило: чем более универсален интерфейс, тем он менее пригоден к использованию в реальных условиях. И это касается не только программ, но и любого электронного устройства, механического устройства, инструмента и т.п.
3
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||
| 30.07.2011, 16:39 [ТС] | |||||
|
Добавлено через 39 секунд Добавлено через 4 минуты Кстати, быстрее, может и будет, допускаю. Но мы же к асму не скатываемся? И да, у меня в первом предикате перебирается вся матрица. Но! Хотим интерфейс попроще- надо чем-то поступиться, скоростью в данном случае. Хотя ваше решение несомненно и быстрее и понятнее. Только ваше хорошее у вас в голове, а моё плохое на бумаге. Вся разница Добавлено через 1 минуту ![]() Двойные стандарты. То есть когда мы пользуемся универсальным интерфейсом, это хорошо. А когда kravam- это плохо.
1
|
|||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 30.07.2011, 16:41 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 30.07.2011, 16:50 [ТС] | |
|
Нет ну почему же- вот я его представил. Не реализацию класса, а решение задачи. А Evg говорит, что его решение быстрее и понятнее. Только оно где-то там!!
Не по теме: Напоминает мне одну херь: работал я на стройке и замещал стропаля-бухаря. И его не хотели увольнять потому, что он "работу знает". Только вот знал-то он её дома, а я не знал на работе... Добавлено через 3 минуты И кстати о термине "рекурсивный обход матрицы". Я тут порылся в памяти, действительно, это чуть ли не мой термин. Просто решая задачи, которые я определял ТАК, наиболее интересные я складывал в папку и её так озаглавливал. А теперь вот решил написать образец для их решения. Так что термин "рекурсивный обход матрицы" придуман для меня мной. Ну- я писал код для единомышленников. Для тех кто долбит такие задачи.
1
|
|
|
|
||||
| 30.07.2011, 16:51 | ||||
|
Теперь представим, что у нас есть универсальный интерфейс, который выдаёт все комбинации. Тупой алгоритм к нему привинтить легко. А более умный алгоритм уже плохо соотносится на уровне интерфейса с универсальным интерфейсом, выдающим комбинации, до тех пор, пока в этом интерфейсе не будет возможности зарубить некоторые ветки сразу же. И в интерфейсе появится костыль. Потом возьмём другую задачу, в которой требуется внести другие коррективы в алгоритм перебора, и так родится второй костыль. Ну и так далее
0
|
||||
|
Фрилансер
|
|
| 30.07.2011, 16:53 | |
Сообщение было отмечено как решение
Решение
kravam, я вот не понимаю смысла такое "чудо" выкладывать. Что вы хотели этим сделать?
Если вы думали что это сейчас все побегут использовать, то вы очень наивны. Вас похвалили за идею и за то что вы что-то сделали, сами подумали головой. Но если собрались выкладывать свой "супер класс", то нужно слушать много критики, в том числе не приятной или не выкладывать вообще и сидеть счастливым со своим кодом. Но когда критикуют, нужно объективно оценивать ситуацию и думать: "почему плохо критикуют, что надо сделать что бы это исправить?", а не кидаться на всех, показывая свою "манию величия". Судя по коду, именованию переменных, стиле программирования и общения с людьми могу сказать, что свой статус под ником вы носите вполне заслуженно. Это все мое имхо и обидеть никого я не собирался
3
|
|
|
|
||
| 30.07.2011, 16:54 | ||
|
0
|
||
| 30.07.2011, 16:54 | |
|
Помогаю со студенческими работами здесь
20
Рекурсивный обход матрицы
Рекурсивный обход. Не могу сделать табуляцию. Обход с выводом имен файлов Составьте программы для решения следующих задач обработки строк, столбцов и диагоналей матрицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc
О Господи, Вечный, Ты . . .
Я помоги, Бесконечный. . .
Я прошу Ты. . .
Я погибаю, спаси. . .
Я прошу Тебя Вечный. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|