Доброго времени суток.
Задача:
Дан двумерный массив(скажем, 4х4) заполненный рандомным образом числами, причем числа могут быть только +1 и -1(условно говоря, два варианта заполнения ячейки массива). Нужно перебрать и зафиксировать всевозможные состояния(конфигурации) данного массива(а таких состояний 2^16).
Пробовал решать через рекурсию и трехмерный массив. Ни к чему дельному так и не пришел.
Подскажите пожалуйста, как наиболее корректным способом перебрать и зафиксировать конфигурации массива?
Был бы очень благодарен, если бы вы в общих чертах набросали программу.
Перебор всевозможных состояний(конфигураций) массива
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
alex_31 писал(а): Нужно перебрать и зафиксировать всевозможные состояния(конфигурации) данного массива(а таких состояний 2^16).
Это то же самое что перебрать все двоичные числа от 0 до 2^16-1, только 0 заменить на -1.
2B OR NOT(2B) = FF
Откуда -1? -1-2-4-8=-15. Это во-первых. А во-вторых в симметричной двоичной значения будут не подряд: -1-2-4-8=-15.1-2-4-8=-13, -1+2-4-8=-11, 1+2-4-8=-9, -1-2+4-8=-7, 1-2+4-8=-5, -1+2+4-8=-3, 1+2+4-8=-1, -1-2-4+8=1, 1-2-4+8=3, -1+2-4+8=5, 1+2-4+8=7, -1-2+4+8=9, 1-2+4+8=11, -1+2+4+8=13, 1+2+4+8=15.Absurd писал(а):Это то же самое что перебрать все двоичные числа от 0 до 2^16-1, только 0 заменить на -1.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Сионист, вот ты написал какую то ерунду вообще.
Автору достаточно перебрать обычный int от 0 до 65535, причем в этом числе каждый бит будет соответствовать ячейке массива 4х4. Какой именно - решать ему. Затем положить что значение 0 - это -1 и таким образом заполнить массив.
А ты какие то симметричные системы начал приплетать. Вот в первый раз мне попадается человек, имеющий знания, но не умеющий их применять... совершенно.
Автору достаточно перебрать обычный int от 0 до 65535, причем в этом числе каждый бит будет соответствовать ячейке массива 4х4. Какой именно - решать ему. Затем положить что значение 0 - это -1 и таким образом заполнить массив.
А ты какие то симметричные системы начал приплетать. Вот в первый раз мне попадается человек, имеющий знания, но не умеющий их применять... совершенно.
It's a long way to the top if you wanna rock'n'roll
Сначала перебор всех возможных чисел, потом ещё разбор числа на биты, вспомогательный массив. И это вместо циклов с приращением +=2.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Сионист, тебе двое человек сказали, что ты пургу несёшь. И я буду третьим.
Тут достаточно сделать цикл от 0 до 65535 и в нём разобрать счётчик цикла на биты наложением маски. Каждый бит будет ответственен за один из элементов массива (какой именно - решать автору). Причём если бит равен 1, то мы вносим в соответствующий элемент 1, а если бит равен нулую, то вносим значение -1. Об этом шла речь, когда Абсурд написал, что "0 нужено поменять на -1". А твою придирку на счёт перебора я так и не понял, так как задача именно на перебор, это сказано в условии.
Пример реализации:
Обратите внимание, что счётчик сделан четырёхбайтным, так как при попытке использовать двухбайтный счётчик мы не сможем выйти из цикла из-за переполнения.
Тут достаточно сделать цикл от 0 до 65535 и в нём разобрать счётчик цикла на биты наложением маски. Каждый бит будет ответственен за один из элементов массива (какой именно - решать автору). Причём если бит равен 1, то мы вносим в соответствующий элемент 1, а если бит равен нулую, то вносим значение -1. Об этом шла речь, когда Абсурд написал, что "0 нужено поменять на -1". А твою придирку на счёт перебора я так и не понял, так как задача именно на перебор, это сказано в условии.
Пример реализации:
Код: Выделить всё
int matrix[4][4];
for (unsigned long i = 0; i < 0x10000; ++i)
{
matrix[0][0] = (i & 0x1) ? 1 : -1;
matrix[0][1] = (i & 0x2) ? 1 : -1;
matrix[0][2] = (i & 0x4) ? 1 : -1;
matrix[0][3] = (i & 0x6) ? 1 : -1;
matrix[1][0] = (i & 0x8) ? 1 : -1;
matrix[1][1] = (i & 0x20) ? 1 : -1;
matrix[1][2] = (i & 0x40) ? 1 : -1;
matrix[1][3] = (i & 0x80) ? 1 : -1;
matrix[2][0] = (i & 0x100) ? 1 : -1;
matrix[2][1] = (i & 0x200) ? 1 : -1;
matrix[2][2] = (i & 0x400) ? 1 : -1;
matrix[2][3] = (i & 0x600) ? 1 : -1;
matrix[3][0] = (i & 0x800) ? 1 : -1;
matrix[3][1] = (i & 0x2000) ? 1 : -1;
matrix[3][2] = (i & 0x4000) ? 1 : -1;
matrix[3][3] = (i & 0x8000) ? 1 : -1;
Print(matrix);
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.