Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование матрицы 
V
    Опции темы
fybvfpfybc
Дата 16.12.2012, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.2.2012

Репутация: -1
Всего: -1



11

Это сообщение отредактировал(а) fybvfpfybc - 26.6.2013, 14:55
PM MAIL   Вверх
feodorv
Дата 16.12.2012, 15:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(fybvfpfybc @  16.12.2012,  16:00 Найти цитируемый пост)
Специально для вас рисовала. 

Спасибо!))) Конечный результат давно понятен. Не понятны требования по преобразованию матрицы. 

Цитата(Фантом @  16.12.2012,  03:07 Найти цитируемый пост)
надо заменить на нули минимально возможное количество единиц? 

Это понятное требование. Оно влечёт за собой представление матрицы в виде графов и т.п.
Можно было бы переставлять единички на свободные места так, чтобы выполнялось 5-условие.
Но ведь нет, заменяются единички нулями, нарушая баланс между числом нулей и единиц. Вероятность встречи единицы падает.

Цитата(fybvfpfybc @  16.12.2012,  03:32 Найти цитируемый пост)
Нет, условия не такие строгие. Должно получиться примерно как в посте выше с нулями и единицами, то есть условия всего два: не больше пяти смежных единиц и их относительно небольшая частота появления (в моём случае вероятность единицы не  больше 1/6), иначе с определённого момента может начаться повторяющийся узор или перекос в какую-либо сторону. А должно быть как в посте выше. Вероятность 10% я взяла для примера. 

Это не понятное требование. Действительно, в матрице можно оставить одну единственную единичку, и такая матрица будет удовлетворять условиям:
  • каждый комплекс из смежных ячеек-единиц содержит не больше пяти ячеек-единиц
  • каждый комплекс окружён как минимум одной ячейкой-нулём так же со всех сторон
  • отсутствует повторяющийся узор
Если не нравится перекос в сторону 0 (а вот почему не нравится?), то можно применить более щадящее решение, которое я привёл. "Не нравится" - это не критерий в постановке задачи  smile 

Если же задача стоит в том, чтобы случайным образом сгенерировать узор из единичек, чтобы выполнялось 5-условие, то эта задача решается не так (то есть не генерируются абы где единицы, а потом убираются лишние).

Вот поэтому и возникают вопросы по формулировке задачи.

Это сообщение отредактировал(а) feodorv - 16.12.2012, 15:45


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
tzirechnoy
Дата 16.12.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Цитата
Перечитайте несколько моих постов ещё раз - должно получиться вполне формальное условие.


2Фантом: у меня всё-таки есть подозрение, что объяснения нормальным логичным языком менее действенны, чем тыканье мордой в ошыбки. То есть тем, кто обычно понимает логику, и случайно как-то сглючил и задал такой вопрос -- тем вообще неважно, они и так и так поймут. У остальных шанс начать думать после получения грязи в физиономию (ну, чисто из-за разрыва шаблона), на мой взгляд, несколько большэ. Хотя и невелик, конечно.
PM MAIL   Вверх
feodorv
Дата 16.12.2012, 15:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(fybvfpfybc @  16.12.2012,  16:00 Найти цитируемый пост)
0000000100
0001100000
0000010000
1010000000
0000111000
0001000000
0000100000
0100000011
0001110001
1100000000

Между прочим, эта матрица не удовлетворяет первоначальным требованиям (хотя 5-условие соблюдается).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
fybvfpfybc
Дата 16.12.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.2.2012

Репутация: -1
Всего: -1



11

Это сообщение отредактировал(а) fybvfpfybc - 26.6.2013, 14:55
PM MAIL   Вверх
Фантом
Дата 16.12.2012, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(tzirechnoy @  16.12.2012,  16:46 Найти цитируемый пост)
2Фантом: у меня всё-таки есть подозрение, что объяснения нормальным логичным языком менее действенны, чем тыканье мордой в ошыбки. То есть тем, кто обычно понимает логику, и случайно как-то сглючил и задал такой вопрос -- тем вообще неважно, они и так и так поймут. У остальных шанс начать думать после получения грязи в физиономию (ну, чисто из-за разрыва шаблона), на мой взгляд, несколько большэ. Хотя и невелик, конечно. 


Это как раз первое, что случилось в этом обсуждении. Тоже не помогло.
PM   Вверх
fybvfpfybc
Дата 16.12.2012, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.2.2012

Репутация: -1
Всего: -1



11

Это сообщение отредактировал(а) fybvfpfybc - 26.6.2013, 14:56
PM MAIL   Вверх
feodorv
Дата 16.12.2012, 18:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(fybvfpfybc @  16.12.2012,  17:04 Найти цитируемый пост)
Если вы про частоту единиц - то это просто пример узора. Целевая матрица значительно больше. 

Я понял, что матрица большая. Кстати, какого размера?
Нет, не про частоту единиц, а про то, что единицы касаются граней матрицы, а по условию 
Цитата(fybvfpfybc @  15.12.2012,  05:19 Найти цитируемый пост)
был окружён как минимум одной ячейкой-нулём так же со всех сторон.

То есть эти единицы окружены нулями не со всех сторон  smile 

А вот первый пример матрицы:
Цитата(fybvfpfybc @  15.12.2012,  05:19 Найти цитируемый пост)
000000
001000
000100
001100
010000
000000

целиком и полностью удовлетворяет этому условию smile 


Цитата(fybvfpfybc @  16.12.2012,  17:04 Найти цитируемый пост)
Задача именно в этом. Буду признательна если расскажите.

Я вижу решение этой задачи так:
  • У матрицы, уже находящейся в каком-то 0-1-состоянии, есть поле (набор элементов), куда можно добавлять единицу, не нарушая условие задачи. Это поле сужается (по крайней мере, не расширяется))) с добавлением каждой единицы, в конце концов это поле истощается, более ни одной единицы добавить не удастся. Назовём элементы матрицы, входящие в это поле, свободными элементами.
  • Соответственно, перед каждым шагом (добавлением единицы) вычисляется число свободных элементов. Тогда случайную позицию (в этом поле) добавляемой единицы можно вычислить как random() % N, где N - число свободных элементов. В самом начале, когда матрица чисто нулевая, N равно M*M за минусом граничных элементов. 
  • Согласно полученной позиции в поле вычисляется положение добавляемой единицы в матрице (строка, столбец). Это не тривиально, и если матрица не сильно большая, то это можно решить линейным массивом с M*M элементов (где M - размер матрицы), заполняемым на предыдущем этапе при подсчёте числа свободных элементов. Если матрица - большая, то положение добавляемой единицы в матрице можно определить перебором свободных элементов.
Решение получается громоздким, но зато честно-случайным (или псевдо-случайным в зависимости от генератора "случайных" чисел). Если же следовать Вашим путём (тоже вариант), то честность случайности нарушается, возможны повторяющиеся узоры, уменьшается число единиц, короче говоря, сплошные минусы))))


Это сообщение отредактировал(а) feodorv - 16.12.2012, 18:20


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 16.12.2012, 18:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Для простоты реализации алгоритма, я бы ввёл для элемента матрицы (помимо 0 и 1) ещё одно значение, скажем -1, которое будет означать, что данный элемент - свободный. При добавлении единицы в матрицу (как раз на место -1) на свободность нужно будет проверить только прилегающие к этой ячейке элементы smile

Добавлено @ 18:38
Если в прилегающей ячейке 0 или 1 - то это значение остаётся. Если же -1, то ячейка проверяется на свободность (а можно ли будет в будущем в неё поместить единицу; если нет, тогда помещаем в эту ячейку 0 - это не 1, и в тоже время не свободная ячейка).

Добавлено @ 18:46
Цитата(feodorv @  16.12.2012,  19:33 Найти цитируемый пост)
При добавлении единицы в матрицу (как раз на место -1) на свободность нужно будет проверить только прилегающие к этой ячейке элементы

Не, не прав. Если образуется комплекс из 5 единиц, то все -1 вокруг него нужно заменить нулями...

Это сообщение отредактировал(а) feodorv - 16.12.2012, 18:47


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
fybvfpfybc
Дата 16.12.2012, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.2.2012

Репутация: -1
Всего: -1



11

Это сообщение отредактировал(а) fybvfpfybc - 26.6.2013, 14:56
PM MAIL   Вверх
feodorv
Дата 16.12.2012, 19:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(fybvfpfybc @  16.12.2012,  19:59 Найти цитируемый пост)
Как бы вы вычисляли число свободных элементов на ненулевой стадии матрицы? 

Число "-1"-элементов (тупо просмотром всех элементов матрицы, и если в ячейке находится -1, то N++).

Добавлено через 3 минуты и 8 секунд
Либо так: 
  • в начале Nfree = M*N;
  • на каждом шаге: если заменяется ячейка со значением "-1" (на 0 или 1), то Nfree--;
Добавлено через 7 минут и 8 секунд
Тут сложности такие:
  • при добавлении 1 понять, образовался ли комплекс из 5 единиц
  • проверить, что ячейка - свободная

Добавлено через 8 минут и 21 секунду
Цитата(fybvfpfybc @  16.12.2012,  19:59 Найти цитируемый пост)
на расстоянии одного элемента во все стороны от 5-комплекса единиц не может быть единицы.

Ага. Но если бы там была бы единица, то это был бы уже 6-комплекс  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
fybvfpfybc
Дата 16.12.2012, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.2.2012

Репутация: -1
Всего: -1



11

Это сообщение отредактировал(а) fybvfpfybc - 26.6.2013, 14:56
PM MAIL   Вверх
volatile
Дата 16.12.2012, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Это видимо узоры для вязания носков, свитеров и т.д.
Вы напрасно на девушку с логикой наехали.

Надо просто расставить единицы красиво, и не так часто, имхо.  smile 

Это сообщение отредактировал(а) volatile - 16.12.2012, 19:30
PM MAIL   Вверх
feodorv
Дата 16.12.2012, 20:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(fybvfpfybc @  16.12.2012,  20:18 Найти цитируемый пост)
Да, пока это сложность.

В принципе, это легко можно сделать той же рекурсией с ведением списка пройденных ячеек комплекса единиц (заодно можно будет узнать число ячеек, входящих в комплекс единиц). То есть для каждой ячейки комплекса (начиная с той, в которой -1 заменили на 1) делаем:
  • если ячейка в списке, пропускаем её
  • добавляем ячейку в список
  • для этой ячейки смотрим прилегающие 8 ячеек. Если в какой-то из них 1, то рекурсивно проверяем и её.
Если число ячеек в списке есть 5, тогда нужна аналогичная рекурсия, но при этом ещё поменять "-1" на "0" во всех ячейках, прилегающих к единичным ячейкам комплекса.
Если меньше, то нужно проверить окружающие (нашу ячейку, в которой "-1" заменили на "0") ячейки со значением "-1" на свободность (ибо их свободность могла измениться). Это делается рекурсией аналогично, только
  • временно меняем в этой ячейке "-1" на "1"
  • проводим аналогичную рекурсию, только учитываем, что число ячеек в комплексе единиц может превысить 5 (это когда эта "1" внезапно объединила два комплекса единиц); если в процессе рекурсии обнаружится этот факт, то в начальную ячейку (в которой "-1" временно заменили "1") нужно поместить 0 (эта ячейка не свободна), а рекурсию можно прекратить
  • если ячейка свободная, то возвращаем ей значение "-1"


Цитата(fybvfpfybc @  16.12.2012,  20:18 Найти цитируемый пост)
Для этого ведь вводится "-1"

Вам всё равно придётся проверять (прилегающие) ячейки со значением "-1" на свободность при добавлении новой единицы (эти ячейки уже могут стать несвободными). 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 17.12.2012, 14:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Вот набросал приблизительный код на C:
Код
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROWS 20
#define COLS 60
#define COMPLEX 5

struct cell_list
{
  int count;
  int rows[COMPLEX];
  int cols[COMPLEX];
};

void cell_list_init( struct cell_list *cl )
{
  cl->count = 0;
}

int cell_list_add( struct cell_list *cl, int row, int col)
{
  int i;

  if( cl->count > COMPLEX ) return 1;

  for( i = 0; i < cl->count; i++)
    if( cl->rows[i] == row && cl->cols[i] == col ) return 0;

  if( cl->count < COMPLEX )
  {
    cl->rows[cl->count] = row;
    cl->cols[cl->count] = col;
  }

  cl->count++;
  return 1;
}

struct matrix
{
  int elems[ROWS][COLS];
  int freeElems;
};

void matrix_init( struct matrix *m )
{
  int r, c;

  for( r = 0; r < ROWS; r++)
    for( c = 0; c < COLS; c++)
      m->elems[r][c] = -1;

  m->freeElems = ROWS * COLS;
}

int matrix_complex( struct matrix *m, struct cell_list *cl, int row, int col)
{
  if( cl->count > COMPLEX ) return 0;
  if( row < 0 || col < 0 || row >= ROWS || col >= COLS ||
      m->elems[row][col] != 1 ) return 1;
  if( !cell_list_add( cl, row, col) ) return 1;
  if( cl->count > COMPLEX ) return 0;

  if( !matrix_complex( m, cl, row-1, col-1) ) return 0;
  if( !matrix_complex( m, cl, row-1, col) ) return 0;
  if( !matrix_complex( m, cl, row-1, col+1) ) return 0;
  if( !matrix_complex( m, cl, row, col-1) ) return 0;
  if( !matrix_complex( m, cl, row, col+1) ) return 0;
  if( !matrix_complex( m, cl, row+1, col-1) ) return 0;
  if( !matrix_complex( m, cl, row+1, col) ) return 0;
  if( !matrix_complex( m, cl, row+1, col+1) ) return 0;

  return (cl->count > COMPLEX) ? 0 : 1;
}

void matrix_entwine( struct matrix *m, struct cell_list *cl, int row, int col)
{
  if( row < 0 || col < 0 || row >= ROWS || col >= COLS ) return;

  if( m->elems[row][col] == 1 )
  {
    if( !cell_list_add( cl, row, col) ) return;
    if( cl->count > COMPLEX ) return;
    matrix_entwine( m, cl, row-1, col-1);
    matrix_entwine( m, cl, row-1, col);
    matrix_entwine( m, cl, row-1, col+1);
    matrix_entwine( m, cl, row, col-1);
    matrix_entwine( m, cl, row, col+1);
    matrix_entwine( m, cl, row+1, col-1);
    matrix_entwine( m, cl, row+1, col);
    matrix_entwine( m, cl, row+1, col+1);
  }
  else if( m->elems[row][col] == -1 )
  {
    m->elems[row][col] = 0;
    m->freeElems--;
  }
}

void matrix_check_free( struct matrix *m, int row, int col)
{
  struct cell_list list;

  if( m->elems[row][col] != -1 ) return;

  m->elems[row][col] = 1;
  cell_list_init( &list );
  if( matrix_complex( m, &list, row, col) )
    m->elems[row][col] = -1;
  else
  {
    m->elems[row][col] = 0;
    m->freeElems--;
  }
}

void matrix_add( struct matrix *m, int position)
{
  struct cell_list list;
  int p = 0;
  int row, col = 0;
  int found = 0;

  for( row = 0; row < ROWS; row++)
  {
    for( col = 0; col < COLS; col++)
      if( m->elems[row][col] == -1 )
        if( p == position ){ found = 1; break; } else p++;
    if( found ) break;
  }

  m->elems[row][col] = 1;
  m->freeElems--;

  cell_list_init( &list );
  matrix_complex( m, &list, row, col);

  if( list.count >= COMPLEX )
  {
    cell_list_init( &list );
    matrix_entwine( m, &list, row, col);
  }
  else
    for( row = 0; row < ROWS; row++)
      for( col = 0; col < COLS; col++)
        matrix_check_free( m, row, col);
}

void matrix_canonize( struct matrix *m )
{
  int row, col;

  for( row = 0; row < ROWS; row++)
    for( col = 0; col < COLS; col++)
      if( m->elems[row][col] == -1 ) m->elems[row][col] = 0;
}

void matrix_print( struct matrix *m )
{
  int row, col;

  for( row = 0; row < ROWS; row++)
  {
    for( col = 0; col < COLS; col++)
      if( m->elems[row][col] == -1 )
        printf( "." );
      else
        printf( "%d", m->elems[row][col]);
    printf( "\n" );
  }

  printf( "\n" );
}

int main()
{
  struct matrix matrix;
  int maxFreeElems;

  srand( time(NULL) );
  matrix_init( &matrix );

  while( matrix.freeElems > 0 )
    matrix_add( &matrix, rand() % matrix.freeElems);
  matrix_print( &matrix );

  matrix_init( &matrix );
  maxFreeElems = matrix.freeElems - (matrix.freeElems / 3);
  while( matrix.freeElems > maxFreeElems )
    matrix_add( &matrix, rand() % matrix.freeElems);
  matrix_canonize( &matrix );
  matrix_print( &matrix );

  return 0;
}


Ничего так, симпатичные матрицы получаются:
Цитата
010010111001010110100100001100011010010101110111101110110111
110010001100010010101100101001011010101000110000101100010101
010110100000111010101101100011001010010010000110000001000000
010100101010000010100001010100100001000110100110110011100111
000001101100111000001100000000000101000010010000101010000010
111100100010100011010001101000000100001010100010100000000001
000100000000001001010000001010011101011000011010000000100100
010001001001011101010010111010000001000110000000001100101110
011000110001000101000110000010111001010000100011100101000010
001010100010010000001001010010000010000010101011001001010000
010000000110101110100000000100011001010110010000010001010011
000110100000000000101011010001000100001000100011000100011000
011010110111011000101000101001101001100010001010001001010010
000000110010001001000010000000101010010111011010101101000111
010100000100101010010111010110100000010001011010100100010010
010111010001101000110010010110001011000100000000110001101000
100010011101000010000000110001010011101101000110000000010001
110000010000010010101101000100001000000100110000101101000101
000101000100111010010000001010010100110000001011100101101101
111100111000010011010111010001000000101101101000101101101101

010010000000000100000100000000101000001100010010100001000001
010000000000001000001010001000000000000000000001010100000010
000100001100000001100000101000000000001000010100000000000111
000000000000000000001001000000000000001000010000000001010000
000100100010000011000000000100100010100000000000000000000101
110000000000100000010010100000000001000101000110000000010010
000100100010001100110000000000001000000100000000010000000010
000000001000000100000000001001001001000011011010000001000000
000000000010000001010001100000001100000000000001001000000100
000000001100010100000001001000000000001001011000000000101100
000000000100100000000110000100001100100000010100010110000000
010010000001000100100000000000000000101101000001000100101000
000000001000010000000011000000100100000010000000000000011100
000000001000000000000000001000000010000000000000000000000000
000010000001000000100000000001000100000010000010000000000110
001000110000100001010000001000000010011000000000000001000000
001000010000010000100010010000000100000000000000000100101000
010001001011000000000010100000000000000100110000000000001001
110000010010000011011000000001100000010000000000000100000001
000101000000000100001000000100100010000000000000100000001100



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.