forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Как быть если нет поддержки двумерных массивов? (http://forum.boolean.name/showthread.php?t=17518)

MoteX 14.11.2012 14:55

Как быть если нет поддержки двумерных массивов?
 
Здравствуйте господа :)
Уже как час мучаюсь но не могу разобраться сам - как реализовать псевдо-двумерный массив через простой? :''((
Просто это прямо беда какая та

moka 14.11.2012 15:03

Ответ: Как быть если нет поддержки двумерных массивов?
 
Используй одномерный (Flat Array) как двумерный с простой арифметикой нахождения индекса.
Например тебе нужен массив с 32, 32 размером. Это будет 32 ^ 2 = 1024 переменных.
Заводишь массив на 1024 переменных.
Затем индекс получаешь по такой формуле: y * width + x. Width = это ширина массива, 32 (он у нас квадратный).
Получается если тебе нужна переменная по координате 2,10 то ты просто выбираешь переменную по индексу 10 * 32 + 2 = 322.
Думаю идея понятна. Можешь на листике нарисовать простой массив 4, 4. И продумать арифметику. Так будет лучше и проще - поймёшь суть паковки данных в один массив.

MoteX 14.11.2012 15:11

Ответ: Как быть если нет поддержки двумерных массивов?
 
Слушай,а реально получилось! набросал на листке...почти гладко:)почему-то правда на строку выше но это фигня! разберемся:) спасибо за дельный совет старина!)

moka 14.11.2012 15:20

Ответ: Как быть если нет поддержки двумерных массивов?
 
На строку выше? Или ниже?
Не забудь что индекс начинается с 0 и заканчивается width - 1 включая. То есть если у тебя ширина массива 32, то последний столбец будет по индексу 31, а первый 0.

MoteX 14.11.2012 15:35

Ответ: Как быть если нет поддержки двумерных массивов?
 
я сделал с 1 по 785 то есть 28 на 28 :) получилось так (x+y*ширина)-ширина - работает:)ты мне помог просто нереально)

MoteX 14.11.2012 16:06

Ответ: Как быть если нет поддержки двумерных массивов?
 
что то я совсем туплю теперь...пробую получить обратно числа - и туплю....
вот у меня получается ( 3+7*28 )-28=171...теперь мне нужно получить числа x и y, т.е. ( x+y*28 )-28=171 Но исходя из того что школу я слабо помню мне это не удается :-D можешь помочь?:)или как то по другому можно найти их?

moka 14.11.2012 16:26

Ответ: Как быть если нет поддержки двумерных массивов?
 
Не отнимай 28 - это "не красиво", делай лучше тогда так, если твой индекс начинается с 1:
3 + (7 - 1) * 28 = 171
Далее, чтобы получить из индекса x и y вот формула:
x = index % height
y = floor(index / width) + 1

% - это модуль остаток от деления.
floor - это стандартная функция округления до нижнего целого числа.

Но ещё раз - рекомендую придерживаться индексов от 0 до 27 (в твоём случае), иначе эти - 1 и + 1 будут очень путать.

ЗЫ, я и вообще школу не закончил, официально у меня 8 классов. Это не имеет значения, тут не школьная программа, а логика, которую программист просто обязан тренировать.

MoteX 14.11.2012 16:52

Ответ: Как быть если нет поддержки двумерных массивов?
 
omg..вообщем почти все понял кроме этого x = index % height...я не правильно делаю,пишу x=171*Abs(28 ) видно либо модуль я понял не так либо умножение ну вообще не в тему :)я безнадежен пока ..

MoteX 14.11.2012 16:58

Ответ: Как быть если нет поддержки двумерных массивов?
 
Отставить я пошел другим путем!) большое спасибо:)..чет я сразу не додумался просто решить уравнение с известным Y )Дожился facepalm

moka 14.11.2012 18:17

Ответ: Как быть если нет поддержки двумерных массивов?
 
Цитата:

Сообщение от MoteX (Сообщение 243609)
omg..вообщем почти все понял кроме этого x = index % height...я не правильно делаю,пишу x=171*Abs(28 ) видно либо модуль я понял не так либо умножение ну вообще не в тему :)я безнадежен пока ..

Моя ошибка, это не модуль. А остаток. Пиши так: x = 171 Mod 28.


Часовой пояс GMT +4, время: 14:19.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot