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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2016, 15:58   #1
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию Поиск в ближайших элементах матрицы.

Продолжение 2-ух предыдущих вопросов.

По задаче дана матрица(Она рабочая и перемещает элементы(циклы и условия всё работает отлично))

Вдобавок к вышеперечисленному есть такое специфическое задание

Нужно проверить есть ли в ближайших 8 ячейках матрицы данные
То есть,нужная область проверки, участок матрицы 3 на 3,посередине наш элемент и нужно найти другой элемент в тех ячейках что окружают основной элемент.

Иными словами есть у меня элемент 0,он находится на участке 3 на 3 посередине,и нужно произвести поиск в ячейках,окружающей элемент 0 на наличие элементов 0 или 5(цифры это образно),так как проект делается.

Сначала была мысль разделить матрицу на несколько частей а потом собрать.
Но 15 раз разбивать и собирать матрицу мягко говоря перспектива не радует.
Поэтому и интересно может есть какие нибудь алгоритмы поиска в определённой части матрицы нужных мне значений.


Я не прошу чтобы за меня что-то писали,это я сразу говорю...

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

Последний раз редактировалось schoolboy99; 26.03.2016 в 16:19.
schoolboy99 вне форума Ответить с цитированием
Старый 26.03.2016, 16:27   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Чтобы рассмотреть участок 3 на 3 с элементом [i1, j1] в середине:
Код:
for i := max(1, i1 - 1) to min(N, i1 + 1) do
  for j := max(1, j1 - 1) to min(M, j1 + 1) do
Если элемент будет с краю матрицы, то рассматриваемый участок будет меньше, чем 3 на 3.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.03.2016, 21:52   #3
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Применил для своей процедуры

У меня наподобие игры,процедура moving прошла и активный элемент 0 оказался в новой ячейке,и вот тут в дело вступает процедура checking

Условия по заданию очень своеобразные.

1)Если в заданном диапазоне встречается 5 то активный элемент 0,становится 1,внутри вложенный оператор условия что если опять он попадает где 5,то уже сформировывается новый активный элемент 0.

2)Если в заданном диапазоне ничего нету то активному элементу присваивается символ 'П'-это означает промах,во условном операторе я ещё сделал проверку,что если опять будет 'П' то ячейка становится пустой '-'

3)Если в заданном диапазоне поисков встречается активный элемент то я вызываю процедуру moving чтобы снова повторить попытку.


Код:
procedure checking;
var
   i, j, i2, j2: integer;
begin
   for y := 1 to kolakt do
   begin
      for i := max(1, i2 - 1) to min(n, i2 + 1) do
         for j := max(1, j2 - 1) to min(m, j2 + 1) do
            if mas[i, j] = '5' then 
            begin
               akt := '1';
               if (akt = '2') then mas[i, j] := '-';
            end                
            else if mas[i, j] = '0' then moving       
            else if mas[i, j] = '-' then
            begin
               akt := 'П';
               if mas[i, j] = '-' then akt := 'П';
               mas[i, j] := '-';           
            end;   
   end;
end;
К сожалению после вызова функции showmatrix он показывает ту же матрицу.
schoolboy99 вне форума Ответить с цитированием
Старый 26.03.2016, 23:18   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Попробую сформулировать то, как понял:
Есть матрица с "-", "5" и "0". Процедура moving перемещает все "0" на новые места, которые раньше были прочерками. После чего нужно выполнить checking. Проверка делает следующее: если два нулевых элемента различаются по обеим координатам не более чем на 1, то нужно опять выполнить moving; если вокруг рассматриваемого нулевого элемента ничего нет, то он заменяется на П; если около рассматриваемого нулевого элемента есть "5", то нулевой элемент заменяется на "1", если же встретится еще одна "5" около рассматриваемого элемента, то элемент заменятся на прочерк и генерируется новый нулевой элемент.

Вопросы:
Так ли я все понял?
Нужно ли обеспечить в процедуре moving перемещение всех нулей на новые места?
Что будет, если будет три "5" около нулевого элемента?
Активный элемент это текущий рассматриваемый нулевой элемент?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.03.2016, 13:24   #5
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

1)Да именно так

2)В процедуре moving все нули перемещаются на новые места случайным образом.
Ваш пример перемещения всех нулей я добавил в свой код и переделал на свою программу и он у меня все 0-ли перемещает.Я там ещё цикл добавил

Забыл сказать что 5 должно стать прочерком,0 становится +1,а 5 становится -.
Иными словами его не будет в следующем такте(шаге).

В будущем там будет задано количество тактов(То есть например 6 объектов надо будет 6 раз перемещать с помощью moving\checnking) но я над этим кодом пока работаю.Над образованием циклов и подсчёта.

3)Если будет 3 5-рки,то 0 удаляет только одну 5-рку(их останется 2).

Последний раз редактировалось schoolboy99; 27.03.2016 в 14:32.
schoolboy99 вне форума Ответить с цитированием
Старый 27.03.2016, 14:36   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

когда я писал решалку судоку, у меня каждая ячейка была объектом, имеющим свойство-массив "соседних" ячеек. это очень удобно.

могу подарить код.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.03.2016, 15:16   #7
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Спасибо вам,но я откажусь
Мне легче написать своё и потом попытаться исправить ошибки и доработать,чем взять чужое..

По крайней мере в этой задаче.
schoolboy99 вне форума Ответить с цитированием
Старый 27.03.2016, 15:22   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
чем взять чужое..
а я и не предлагал мой код тупо скопипастить. Я предлагал ознакомиться с его организацией.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.03.2016, 15:44   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Честно говоря, после ответов не прибавилось у меня понимания
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.03.2016, 16:00   #10
schoolboy99
Пользователь
 
Регистрация: 11.02.2015
Сообщений: 57
По умолчанию

Лист Задания

Насчёт тактов,я пока пишу код.


А сверху код - это попытка реализовать ниже перечисленные условия

• В текущий такт времени происходят следующие события:

2. Если в 8 соседний клетках(вокруг точки прыжка) и в самой точке конца прыжка нет пассивных элементов, то текущему активному элементу присваивается -1(промах)
3. Если в 8 соседних клетках или в самой точки конца прыжка есть 1 или несколько пассивных объектов то этот активный элемент получает +1(выполнено),т.е. алгебраически суммируются предыдущие и этот+1(1 это своеобразный рейтинг). Все пассивных в этих 9-ти клетках исчезают, их уничтожает активный объект и в следующем такте времени их нет.
4. Текущий активный объект переходит в точку конца прыжка в следующем такте времени.
5. Такты перебираются. В текущем такте все активные.
Замечание:
Если активный объект прыгает на активный объект то попытка прыжка повторяется(вызываю moving).
• Если у активного элемента рейтинг(+2) то в следующем такте времени он исчезает и не участвует в дальнейшем рассмотрении.
• Если у активного элемента 2+ то он генерирует случайное место на полей другому новому активному элементу при его плюсы обнуляются.
• Если у любой пустой клетке есть 3 активных соседа, то в этой же клетке в следующее такте времени рождается активный объект.

Последний раз редактировалось schoolboy99; 27.03.2016 в 17:39.
schoolboy99 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение точек ближайших к прямой (Си) Ckiv Помощь студентам 1 06.02.2014 17:00
Бинарный поиск с определением ближайших узлов k281092 Паскаль, Turbo Pascal, PascalABC.NET 4 20.11.2011 21:30
Задача о паре ближайших точек CyberGirl Помощь студентам 4 18.06.2011 18:11
Матрицы.Поиск координат элементов матрицы. dima-intro Помощь студентам 1 11.12.2010 22:48
Найти 2 ближайших ел-та в массиве neon2k Помощь студентам 3 08.01.2009 02:50