Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 22:34   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию Отобрать блоки массива

Всем доброго времени суток, необходимо отобрать элементы массива заключённые в нули (то есть отобрать единицы) и переместить каждый блок из единиц в отдельный массив.Размер массива может быть произвольный, как и расположение элементов в нём, также могут быть и сложные конструкции типа
00111111100
00100000100
00101100100
00101100100
00100000100
00111111100
00000000000
ну и естественно не обязательно квадратной формы, возможны любые варианты.
. Изначально чтобы определить единици я прохожусь по массиву рекурсивной функцией, однако как отделить отдельные блоки не знаю. По этому прошу вашей помощи.
Вот код функции
Код:
void checkImage(int r,int e,int & ch)
        {
           
            if (e < 0 || r < 0 || r>=Width ||e>=Height)
                return;
            if (ch[r, e] == 0)
                return;
            
            checkImage(r + 1, e, ch);
            checkImage(r, e+1, ch);
            checkImage(r - 1, e, ch);
            checkImage(r, e-1, ch);
//ch это массив чисел.
        }
00000000000000000000
00011110000111100000
00011110000100111000
00011110000100001000
00000000000111111000
00000000000000000000
00000001111100000000
00000001111100000000
00000000101000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000

Последний раз редактировалось revaldo666; 03.06.2012 в 22:45.
revaldo666 вне форума Ответить с цитированием
Старый 04.06.2012, 02:25   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Если я правильно понял, то в новом массиве должны быть одни единицы. Тогда прогоняй весь массив с условием если в массиве встречается 1 то записывай в новый массив получается примерно такое:

Код:
for(int i = 0; i < SIZE_ARRAY; i++)
      if(Array[i] == 1)
            ArrayNew[i] = Array[i];
где SIZE_ARRAY - размер массива
Array[] - исходный массив с 0 и 1
ArrayNew[] - отобранный массив
Если массив двумерный то тут нужно немного изменить цикл

Код:
for(int i = 0; i < Stirng; i++)
      for(int a = 0; a < Column; a++)
            if(Array[i][a] == 1)
                  ArrayNew[i][a] = Array[i][a];
где
String - число строк массива
Column - число столбцов массива
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 04.06.2012 в 02:32.
kineziz вне форума Ответить с цитированием
Старый 04.06.2012, 02:37   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Для большей понятности, скажите, каким должен быть ответ на Ваш пример
Цитата:
00000000000000000000
00011110000111100000
00011110000100111000
00011110000100001000
00000000000111111000
00000000000000000000
00000001111100000000
00000001111100000000
00000000101000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 04.06.2012, 08:47   #4
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

исходный массив
00000000000000000000
00011110000111100000
00011110000100111000
00011110000100001000
00000000000111111000
00000000000000000000
00000001111100000000
00000001111100000000
00000000101000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
а ответ
массив 1 (позиции первого блока)
1111
1111
1111
массив 2(позиции второго блока)
111
1 111
1 1
11111
массив 3(позиции третьего блока)
11111
11111
1 1
и так далее если есть ещё блоки.
revaldo666 вне форума Ответить с цитированием
Старый 04.06.2012, 10:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А это случайно не вторая часть кодирования Хаффмана?
Жутко похоже на алгоритм сжатия.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.06.2012, 10:48   #6
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

не знаю на счёт Хафмана, задание было разбить массив на отдельные блоки)
revaldo666 вне форума Ответить с цитированием
Старый 04.06.2012, 11:59   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Ну, можно в лоб сделать примерно так:
1) Бежишь по массиву до первой попавшейся единички
2) Создаешь новый массив для этого куска
3) Запускаешь рекурсивную (или с помощью очереди) процедуру поиска единичек, образующих связанную с найденной область, попутно записывая их в созданный массив и обнуляя в старом массиве (чтобы не наткнуться на них позже)
4) если массив не закончился, возвращаешься к пункту 1 и ищешь дальше
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 04.06.2012, 12:35   #8
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Вот я не могу определится когда блок единичек закончился, чтобы приступить к поиску нового. (не получается условие составить)Ведь блоки могут быть разными, а также включать во внутрь себя ещё блоки.
revaldo666 вне форума Ответить с цитированием
Старый 04.06.2012, 13:29   #9
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

в вашем случае можно просто делать полный обход по массиву
Код:
for x = 0 .. width-1
   for y = 0 .. height - 1
      если единичка, запускаем поиск всего блока, не забываем найденные единички обнулять
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 04.06.2012, 13:47   #10
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

тоесть if(ch[x][y]==1)
{
Запускаем рекурсивную функцию
}
а в функции

Код:
void checkImage(int r,int e,int & ch)
        {
           
            if (e < 0 || r < 0 || r>=Width ||e>=Height)
                return;
            if (ch[r][e] == 0)
                return;
            if(ch[r][e] == 1)
                 {
                ch[r][e]=0;
                  }
            checkImage(r + 1, e, ch);
            checkImage(r, e+1, ch);
            checkImage(r - 1, e, ch);
            checkImage(r, e-1, ch);
        }
Проверяем по четырем направлениям и обнуляем, но всё равно я не пойму как найденные блоки в отдельные массивы засунуть.
revaldo666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CSS блоки WindWdM HTML и CSS 0 16.02.2012 14:56
Блоки в CSS WindWdM Помощь студентам 0 24.11.2011 15:03
Как со списка чисел отобрать только простые числа SeRhy Помощь студентам 1 14.12.2007 12:06