В
Все
Б
Биология
Б
Беларуская мова
У
Українська мова
А
Алгебра
Р
Русский язык
О
ОБЖ
И
История
Ф
Физика
Қ
Қазақ тiлi
О
Окружающий мир
Э
Экономика
Н
Немецкий язык
Х
Химия
П
Право
П
Психология
Д
Другие предметы
Л
Литература
Г
География
Ф
Французский язык
М
Математика
М
Музыка
А
Английский язык
М
МХК
У
Українська література
И
Информатика
О
Обществознание
Г
Геометрия
Dasha555m
Dasha555m
27.07.2021 16:19 •  Информатика

Каждый элемент квадратной матрицы размером nxn равен нулю, либо единице. найдите количество "островов", образованных единицами. под "островом" понимается группа единиц (либо одна единица), со всех сторон окруженная нулями (или краями матрицы). единицы относятся к одному "острову", если из одной из них можно перейти к другой, "наступая" на единицы, расположенные в соседних клетках. соседними являются клетки, граничащие по горизонтали или вертикали. входные данные читаются из файла input.tzt результат выводится в файл output.txt.

Показать ответ
Ответ:
гикат
гикат
09.07.2020 08:46
Пришлось написать рекурсивную процедуру. Надеюсь, это не вызовет вопросов.
Во вложениях даны тестовые файлы.

const
  n1 = 20;

type
  r5 = record
    value: byte; {Значение элемента}
    right: boolean; {Есть ли единица справа?}
    down: boolean; {Есть ли единица ниже?}
    left: boolean; {Есть ли единица слева?}
    viewed: boolean {Элемент просмотрен?}
  end;

var
  n, i, j, k: integer;
  m: array[1..n1, 1..n1] of r5;
  fin, fout: Text;

procedure Mark(i: integer; j: integer);
{рекурсивная процедура, отыскивающая весь островок и помечающая его}
begin
  if not m[i, j].viewed then
  begin
    m[i, j].viewed := true;
    if m[i, j].right then Mark(i, j + 1);
    if m[i, j].down then Mark(i + 1, j);
    if m[i, j].left then Mark(i, j - 1)
  end
end;

begin
  Assign(fin, 'Input.txt');
  Reset(fin);
  {Инициализация из файла}
  Readln(fin, n);
  for i := 1 to n do
    for j := 1 to n do
      Read(fin, m[i, j].value);
  Close(fin);
  {Определение соседей}
  for i := 1 to n do
    for j := 1 to n do
    begin
      if m[i, j].value = 1 then begin
        if j < n then m[i, j].right := (m[i, j + 1].value = 1) else m[i, j].right := false;
        if i < n then m[i, j].down := (m[i + 1, j].value = 1) else m[i, j].down := false;
        if j > 1 then m[i, j].left := (m[i, j - 1].value = 1) else m[i, j].left := false
      end;
      m[i, j].viewed := false
    end;
  {Подсчет "островков"}
  k := 0;
  for i := 1 to n do
    for j := 1 to n do
    begin
      with m[i, j] do
      begin
        if (m[i, j].value = 1) and (not m[i, j].viewed) then begin
          k := k + 1;
          Mark(i, j)
        end
      end
    end;
  Assign(fout, 'Output.txt');
  Rewrite(fout);
  Writeln(fout, k);
  Close(fout)
end.
0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота