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

Поиск:

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


Новичок



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

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



11

Это сообщение отредактировал(а) fybvfpfybc - 26.6.2013, 14:53
PM MAIL   Вверх
tzirechnoy
Дата 15.12.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



К нулю её приравняй полностью.
PM MAIL   Вверх
fybvfpfybc
Дата 15.12.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



11

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


Эксперт
***


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

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



[quote]начальную 10%-вероятность единиц сохранять не обязательно, но это не может быть 0% [quote]

О, объявляются ещё условия.
Ну, запишы в левый верхний угол единицу. Будет не 0%.
PM MAIL   Вверх
fybvfpfybc
Дата 15.12.2012, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



11

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


Эксперт
****


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

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



Цитата(fybvfpfybc @  15.12.2012,  05:19 Найти цитируемый пост)
Нужно преобразовать матрицу

А в чём заключается преобразование матрицы? В перестановке строк, столбцов, элементов?


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


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


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

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



Цитата(fybvfpfybc @  15.12.2012,  19:57 Найти цитируемый пост)

Если нечего сказать по теме - не трать чужое время. 

Он, вообще говоря, прав: условие в его нынешнем виде вполне допускает такое решение. Может быть, Вы четче сформулируете, что именно Вам надо?
PM   Вверх
fybvfpfybc
Дата 16.12.2012, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



11

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


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


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

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



Цитата(fybvfpfybc @  16.12.2012,  02:29 Найти цитируемый пост)

Количество единиц сохранять не обязательно, нужно оставить его примерно таким же. Просто замена лишних единиц на нули. 

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


Новичок



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

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



11

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


Начинающий
***


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

Репутация: нет
Всего: 54



Можно ли свести решение к следующему:
1. Последовательно обойти массив поэлементно слева-направо и сверху-вниз.
2. Для каждой встречающейся единицы выполнять поиск комплекса только по направлению движения (без анализа назад).
3. При нахождении комплекса длиною 5 символов терминировать его нулями.

?


--------------------
Слава Україні!
PM MAIL   Вверх
Фантом
Дата 16.12.2012, 13:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(fybvfpfybc @  16.12.2012,  03:32 Найти цитируемый пост)
Нет, условия не такие строгие. 


В таком случае я совершенно не понимаю, чем Вам не понравилось решение с единственной единицей в одном углу.
PM   Вверх
feodorv
Дата 16.12.2012, 14:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Фантом @  16.12.2012,  14:17 Найти цитируемый пост)
В таком случае я совершенно не понимаю, чем Вам не понравилось решение с единственной единицей в одном углу. 

В этом же стиле можно предложить более щадящее решение - занулить каждый третий столбец и каждую третью строчку. Но есть подозрение, что нужно не это. А что - не понятно...


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


Новичок



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

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



11

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


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


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

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



Цитата(fybvfpfybc @  16.12.2012,  16:00 Найти цитируемый пост)

Специально для вас рисовала. 


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

Как вариант: напишите подробно, в связи с чем эта задача возникла. Тогда окружающие, возможно, смогут догадаться сами, что именно Вам на самом деле нужно.
PM   Вверх
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   Вверх
fybvfpfybc
Дата 17.12.2012, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



11

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


Эксперт
****


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

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



Цитата(fybvfpfybc @  17.12.2012,  20:36 Найти цитируемый пост)
feodorv, вау, моя безграничная благодарность вам!

 smile  smile 

В принципе, функция matrix_entwine вообще не нужна, ибо если в комплексе 5 единичек, то matrix_check_free и так поставит нулики куда нужно  smile 
Итого код для matrix_add становится совсем простым:
Код
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--;

  for( row = 0; row < ROWS; row++)
    for( col = 0; col < COLS; col++)
      matrix_check_free( m, row, col);
}



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


Эксперт
****


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

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



Цитата(fybvfpfybc @  17.12.2012,  19:36 Найти цитируемый пост)
не могу вам даже плюсиков поставить 

это не проблема. сделано.
За такую красивую матрицу можно и не один плюсик поставить...

PM MAIL   Вверх
feodorv
Дата 17.12.2012, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(volatile @  18.12.2012,  00:40 Найти цитируемый пост)
За такую красивую матрицу можно и не один плюсик поставить...

Спасибо  smile Про узор на ткани я думал (матрица 100x50, вторая половина получается зеркальным отображением первой), но насчёт носок... даже в голову не пришло  smile 


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

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

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

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

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


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

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


 




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


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

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