Прошу пардона, давно тут зарегился но как то не получалось заглядывать... Так что мог что-то и нарушить, но по раздолбайству, а не по злому умыслу
Pretorian, не совсем так. И яванское тут нипричем. Вобщем-то всё равно какого цвета кошка, лишь бы мышей ловила... Давай я лучше поточнее задачу сформулирую.
Итак. Есть стакан для тетриса, в котором уже лежат какие-то кубики. Кубики семи разных цветов - красный R, синий B, зеленый G, желтый Y, белый W, малиновый M и оранжевый O.
Восьмым цветом * будем обозначать пустое пространство. Значками _ и | соответственно дно и стенки стакана. Например такая картинка:
|**********|
|**********|
|Y*YY**W**|
|W*RRBBB**|
|W*RBBBB**|
|WWRRBBB**|
|W*********|
|W*G*******|
|-------------|
Сначала требуется как-то разметить сами блоки. Например на картинке видно, что слева расположен белый блок. Внизу - зеленый из одного кубика. Выше - сцепленные красный и синий блоки, На белом стоит желтый. На красном - желтый. На синем - белый. Первая задача - разметить блоки из соседних одноцветных кубиков. Это та же самая задача об островах, что здесь рассматривалась, но только с ЦВЕТНЫМИ островами. Так что пиши хоть на яве, хоть на форте, хоть на смаллтоке с АПЛ, от рассмотрения цветов не уйти никуда. На яве я написал рекурсивный алгоритм, который это делает. К сожалению Java - ЕДИНСТВЕННЫЙ язык программирования, на котором разрешено разрабатывать приложения под платформу Android(бывший Google phone). Иначе бы попытался это сделать на форте. Сам не слишком яву люблю, но работать пришлось с тем что есть.
Следующая задача - определить, какие блоки упадут, какие нет, если блоки уже каким-то способом размечены (я например связывал кубики в двусвязные списки). Например на картинке не упадут зеленый и белый блоки, стоящие на дне. А так же желтый блок, стоящий на белом. А упадут красный, синий и опирающиеся на них белый и желтый. Сразу предупреждаю. Тупо смотреть, есть ли под блоками пустое пространство - не прокатит. Например красный и синий блоки на картинке сцеплены. А белый и желтый на них опёрты. Тем не менее все они должны быть помечены как падающие, и для каждого из них вычислено расстояние, на которое они упадут. На картинке это расстояние равно 1 клетке для всех 4-х падающих блоков, поскольку красный при падении обопрётся о зеленый, синий с ним сцеплен а белый с желтым на них опираются. Алгоритм должен все такие сложные ситуации правильно обрабатывать.
P.S. Прошу еще раз прощения. Если кого заинтересует задача, давайте алгоритм лучше на словах. Типа "помечаем так-то, проверяем то-то". Просто в моём решении (опять же ява под Android) есть ряд довольно тонких моментов, отладить которые вот так сразу будет тяжело. И как обойтись без них на том же форте например, мне не понятно. Думаю что никак. У меня это плотно заняло 2 выходных, часов по 10 каждый. Поэтому не надо точного решения. Интересен просто ход мысли. Может быть у кого-то получится проще чем у меня.