iamhrusha
?>

Решить по информатике с кругов эйлера

Информатика

Ответы

gudachaa1480
ПОСЛЕДОВАТЕЛЬНОСТЬ ФИБОНАЧЧИ, математическая ПОСЛЕДОВАТЕЛЬНОСТЬ, каждый член которой является суммой двух предыдущих. Таким образом, если энный член последовательности обозначается хn, то для всей последовательности справедливым будет уравнение: хn+2=хn+хn+1, первыми двумя членами которого будут x1=l и x2=1. Порядок последовательности при этом таков: 1, 1, 2, 3, 5, 8, 13, 21..., следующим числом будет 34, т. к. сумма 13 и 21 равна 34 и т.д. Когда число n становится очень большим, отношение соответствующих членов устремляется к величине (Ц5+l)/2. Это соотношение называется золотым. В природе последовательность Фибоначчи можно проследить на примерах спирального развития сегментов раковины и лепестков подсолнуха, расходящихся лучами из одной точки в центре цветка. см. также ЗОЛОТОЕ СЕЧЕНИЕ. 
secretar62
Пришлось написать рекурсивную процедуру. Надеюсь, это не вызовет вопросов.
Во вложениях даны тестовые файлы.

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.

Ответить на вопрос

Поделитесь своими знаниями, ответьте на вопрос:

Решить по информатике с кругов эйлера
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

bagrjashv41
Марюк-Мубариз
mashere59
vvk2008
Verdievruslan
dinadumno2114
sarbaevmax
f-d-a-14
Nadezhdachizhikova7968
mnogomams47
appbiznessm
Малыхин Валерьевна621
litlenet
Хромов1501
ilkindadashov935232