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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2015, 14:08   #1
manchester_alan
Форумчанин
 
Регистрация: 07.01.2015
Сообщений: 231
По умолчанию Матрицы

Помогите придумать... Вот к примеру матрица...

0 0 0 0 0 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0

и надо чтоб все числа вокруг единицы тоже стали единицами вот так...

0 1 1 1 1 1 0
0 1 1 1 1 1 0
0 1 1 1 1 1 0

просто хотя бы как сделать словами, программу саму не нужно)

Последний раз редактировалось manchester_alan; 15.06.2015 в 14:23.
manchester_alan вне форума Ответить с цитированием
Старый 15.06.2015, 14:46   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Самое простое:
Пройтись по матрице и для каждой единицы вокруг поставить 2 вместо 0;
Пройтись еще раз по матрице, заменяя 2 на 1.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.06.2015, 14:50   #3
manchester_alan
Форумчанин
 
Регистрация: 07.01.2015
Сообщений: 231
По умолчанию

ну мне это надо примерно... b2[... , ...]:=.... вот с i , j это как реализовать...?

именно соседние, а так числа могут быть и из 4 ячеек или 3 или 2 или 1...

в общем это морской бой, надо чтоб вокруг убитого корабля поставить точки типо подбит...и вот как найти эти соседние элементы вокруг корабля..
manchester_alan вне форума Ответить с цитированием
Старый 15.06.2015, 14:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Самое простое:
Пройтись по матрице и для каждой единицы вокруг поставить 2 вместо 0;
Пройтись еще раз по матрице, заменяя 2 на 1.
на самом деле, менять 2-ки на единицы потом смысла нет.
Автору топика нужно так отметить поля в игре "Морской бой", куда стрелять уже не надо (вокруг потопленного корабля противника).
Использовать другой код для отметки, на мой взгляд, хорошая идея. Можно отображать просто точками (как обычные выстрелы "мимо"). а можно, при желании, отобразить эти поля по другому. ну, например, заштриховать или затенить серый цветом...

впрочем, это уже детали...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.06.2015, 16:14   #5
manchester_alan
Форумчанин
 
Регистрация: 07.01.2015
Сообщений: 231
По умолчанию

ну так есть идеи, как это с i,j делать...? b2[... , ...]:=
manchester_alan вне форума Ответить с цитированием
Старый 15.06.2015, 16:25   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

есть i,j ячейки с 1
Ну и проверяй 8 ячеек вокруг, не забывая того, что индексы не должны вывалиться за массив
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.06.2015, 16:25   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Пройтись по матрице и для каждой единицы вокруг поставить 2 вместо 0;
Код:
if ( b2[i,j]=1 ) //ячейка занята (или что там)
  and ( j+1 <= ....) // есть ли сосед в этом направлении
            and ( b2[i,j+1] =0 ) //соседняя в этом направлении свободна 
                                        then b2[i,j+1]:=2;
и так для ВСЕХ соседних с b2[i,j];
Цитата:
просто хотя бы как сделать словами, программу саму не нужно)
А какие соседние?
там где индекс отличается на единицу.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.06.2015 в 16:30.
evg_m на форуме Ответить с цитированием
Старый 15.06.2015, 16:44   #8
manchester_alan
Форумчанин
 
Регистрация: 07.01.2015
Сообщений: 231
По умолчанию

да сам принцип понятен..( а вот у меня это как сделать...?

Код:
for i:=1 to 10 do           //графическое поле компьютера
   for j:=1 to 10 do
    begin
    case b2[i,j] of
    4: begin                     //подбитый или не до конца корабль
         if ((b2[i+1,j]=2)        //не до конца подбитый
          or(b2[i,j+1]=2)
          or(b2[i-1,j]=2)
          or(b2[i,j-1]=2))
          or (((b2[i+1,j]=4)and(b2[i+2,j]=2))
          or((b2[i,j+1]=4)and(b2[i,j+2]=2))
         or((b2[i-1,j]=4)and(b2[i-2,j]=2))
         or((b2[i,j-1]=4)and(b2[i,j-2]=2)))
         or(((b2[i+1,j]=4)and(b2[i+2,j]=4) and (b2[i+3,j]=2))
          or((b2[i,j+1]=4)and(b2[i,j+2]=4)and(b2[i,j+3]=2))
         or((b2[i-1,j]=4)and(b2[i-2,j]=4)and(b2[i-3,j]=2))
         or((b2[i,j-1]=4)and(b2[i,j-2]=4)and(b2[i,j-3]=2)))
            then
          begin
              cfield.Canvas.Brush.Color:=clYellow;
              cfield.Canvas.Rectangle(25*i-25,25*j-25,25*i,25*j)
              end
             else                                   //убитый
              begin
               cfield.Canvas.Brush.Color:=clred;
               cfield.Canvas.Rectangle(25*i-25,25*j-25,25*i,25*j);
               // вот здесь нужно найти соседние элементы рядом с убитым кораблем...
              end
manchester_alan вне форума Ответить с цитированием
Старый 15.06.2015, 18:46   #9
manchester_alan
Форумчанин
 
Регистрация: 07.01.2015
Сообщений: 231
По умолчанию

Код:
  b2[i-1,j-1]:=3;
                  b2[i,j-1]:=3;
                  b2[i+1,j-1]:=3;
                  b2[i-1,j]:=3;
                  b2[i+1,j]:=3;
                  b2[i-1,j+1]:=3;
                  b2[i,j+1]:=3;
                  b2[i+1,j+1]:=3;
вот так правильно но тут он ставит только лишь по 1палубному кораблю...а как сделать на любой корабль?
manchester_alan вне форума Ответить с цитированием
Старый 16.06.2015, 11:18   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

вместо ОДНОЙ ячейки корабля (i,j)
пройтись по ВСЕМ ячейкам ЭТОГО корабля
какие это ячейки? ну наверное как-то +/- i/j.
и для всех таких ячеек делать то что нужно.
Чтобы было понятнее (тебе самому) таких действия лучше "заворачивать" в процедуры. Например
Код:
procedure отметитьпопаданиевкорабль(x,y: word; //координаты попадания);
begin
// а здесь то, что мы должны сделать 
// с этой точкой 
// и ВСЕМИ точками зависящими от нее. 
end;

procedure отметитькорабль(x1,y1, x2,y2: word //координаты начала конца корабля
                                    );
...

TEnumWordDir =(ewd_up, //корабль идет вверх
                        ewd_down, 
                        ewd_left,
                        ewd_right
                     );

procedure отметитькорабль2(x,y: word; //координаты начала корабля
                                        len: word; //число палуб
                                        dir: TEnumWordDir //направление корабля  
                                     );
...
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.06.2015 в 11:28.
evg_m на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ и Pascal. Матрицы. Дана матрица размером n х m. Инвертировать каждую строку матрицы. Summerlight Помощь студентам 0 24.12.2013 00:19
Перекодировать консолевкий код под оконное приложение в Билдер 6. Решаю матрицы Матрицы g.e.s Общие вопросы C/C++ 0 18.11.2012 20:21
Первый элемент - размерность матрицы, остальные образуют строки этой матрицы Anastasiya_Pot Помощь студентам 2 10.04.2012 09:46
С++.три матрицы, упорядочить строки той матрицы у которой больше нулевых строк Ирина1992 Помощь студентам 12 20.11.2011 13:01
На главную диагональ матрицы поместить наибольшие элементы этой матрицы mivel Помощь студентам 2 23.12.2009 21:19