Показать сообщение отдельно
Старый 14.05.2011, 23:37   #33
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: очень маленькие хинты

Сообщение от LLI.T.A.L.K.E.R. Посмотреть сообщение
Что там значат 8 и 4?
Написали от балды, чтобы запутать?

И что за 1+2=3
Нельзя тупо ввести 3 и всё..

Глупых вопросов больше не напишу..
Не понял я левую картинку.
Омг, если для тебя это не понятно, то это не значит что написали от балды.


Есть тайл, и четыре к нему прилегающих, тебе нужно высчитать какую картинку вставлять.
Можешь сделать тупо кучей If'ов (16*4), и будет у тебя гипер говнокод, на строк 70. А можно тупо сделать по умному немного приложив логику.
Разжую.
Исходя из картинки сверху, поле является таким:
0 1 0 0
0 1 0 0
0 1 1 1
0 0 0 0
Нужно правильно подобрать тайлы, чтобы они исходя из поля, заполнили дорогу.
Смотрим на тайл в первой картинке по координате 2,3. Относительно ему есть тайл сверху и справа.
Если за условность взять нумерацию как показано на первой картинке:
вверх - 1; вправо - 2; вниз - 4; влево 8. Числа кратные двум, и их можно плюсовать как угодно. В одно число можно запаковать все четыре, или любую другую комбинацию. Например 4+2+1 = 7, при этом иначе ты 7 не разберёшь, как только на 4, 2 и 1. (кратные двум). Если рассмотреть в бинарном коде, то тут всё просто:
1: 0001
2: 0010
4: 0100
8: 1000
Получается 7 будет: 0111.
Такой подход используют много где, в тех же флагах в виде параметров для функций. Но длина ограничена естественно, 16 чисел - это будет 16 бит. Если брать уже 32 числа, то это будет весьма длинное число: 2^32-1 = 4,294,967,295. Столько флагов обычно не используют.
Вернёмся назад. Значит у нас есть 4 числа, и нужно получить флаг. Предположим мы разбираем центральную ячейку и поле такое:
0 0 0
0 1 0
0 0 0
Сверху 0, справа 0, снизу 0, слева 0. Получается при сумме 0. Смотрим на вторую картинку - по индексу будет 0.
Далее рассмотрим такой сценарий:
0 1 0
0 1 0
0 1 0
Сверху 1, значит +1. Снизу тоже 1, значит +4. В результате 5. Идём снова в картинку с тайлами: Вертикальная дорога.
Смотрим если все вместе (1+2+4+8 = 15), это будет последняя перекрёсток.
Если справа пусто, а везде в других есть, то будет 1+4+8 = 13, и по картинке с тайлами сходится.

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

LLI.T.A.L.K.E.R., если ты не понял сам, то не гони, а лучше скажи что не понимаешь, тебе объяснят, если сам не способен.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Dimon638 (26.11.2015), impersonalis (15.05.2011), LLI.T.A.L.K.E.R. (15.05.2011), Randomize (17.05.2011), St_AnGer (15.05.2011)