Помощь - Поиск - Пользователи - Календарь
Полная версия: Игра с цифрами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dennis
Есть массив(двумерный), который заполнен цифрами 1, 2, 3
Пример
1122
1212
2221
1211

за минимальное число раз сделать массив однородным, то есть так чтобы он состоял только из 1-ц,2-ек или 3-ек. Известно, что цифры меняются в соответствии:
1 на 3
2 на 1
3 на 2

причем при изменении какой-либо цифры помимо её самой, меняются и рядом стоящие с ней сверху, снизу, справа и слева в том же соответствии. В моём примере минимальное число операций будит равно двум (весь массив будит заполнен единицами). За ранее спасибо за помощь в реализации программы.
volvo
Цитата(Dennis @ 24.02.05 10:43)
За ранее спасибо за помощь в реализации программы.

Это что значит? Что здесь надо готовую программу выложить? Я думаю, что всю программу никто писать не будет. Если есть какие-то конкретные проблемы - пожалуйста... Что именно не получается?
Guest
Цитата(volvo @ 24.02.05 11:47)
Это что значит? Что здесь надо готовую программу выложить? Я думаю, что всю программу никто писать не будет. Если есть какие-то конкретные проблемы - пожалуйста... Что именно не получается?

Я вот пробовал, делать рекурсию с полным перебором, но происходит переполнение стека и... Вобщем мне бы просто подсказал какие идеи другие кроме перебора, а я конечно сам всё сделаю =)
volvo
А выложи-ка свою программу... Может и избавимся от переполнения стека ;)
Dennis
Код
program my;

uses crt; const num=10;
type my1=array[1..num,1..num] of char;
type my2=array[1..num,1..num] of char;

var

  m,n,i,j,ci,cj:byte;
  k:string;
  min,el:integer;
  opn:longint;
  a:my1;
  b:my2;
  F,F1:text;

function odnor:byte;
        begin
        for i:=1 to n do
         begin
              for j:=1 to m do
                  begin
                       if b[i,j] = b[1,1] then
                          inc(el);
                  end;
         end;

         if el=n*m then odnor:=1 else odnor:=0;

        end;


{////////////////////////////////////////////////////////////////////////////}

procedure selector(ci,cj:byte);
         begin
              case b[ci,cj] of
                   '1': begin b[ci,cj]:='3'; exit; end;
                   '2': begin b[ci,cj]:='1'; exit; end;
                   '3': begin b[ci,cj]:='2'; exit; end;
              end;
         end;

{////////////////////////////////////////////////////////////////////////////}

procedure changecolor(i,j:byte);
         begin

              selector(i,j);

              if (i > 1) then
                      selector(i-1,j);

              if (j < m) then
                      selector(i,j+1);

              if (i < n) then
                      selector(i+1,j);

              if (j > 1) then
                      selector(i,j-1);

         end;

{////////////////////////////////////////////////////////////////////////////}

procedure forw(i,j:byte);
         begin

              inc(opn);

              if odnor = 0 then
                 begin

                      changecolor(i,j);

                      if (i > 1) then
                         forw(i-1,j);

                      if (j < m) then
                         forw(i,j+1);

                      if (i < n) then
                         forw(i+1,j);

                      if (j > 1) then
                         forw(i,j-1);

                 end
                 else
                      min:=opn;

       end;

{////////////////////////////////////////////////////////////////////////////}
{//////////////////////////// Reading from input file ///////////////////////}

begin clrscr;

     assign(F,'input.txt');
     reset(F);

              read(F,n);
              readln(F,m);

     for i:=1 to n do
         begin
              readln(F,k);
              for j:=1 to m do
                  begin
                       a[i,j]:=k[j];
                       b[i,j]:=k[j];
                       write(a[i,j]);
                  end; writeln;
         end;
     close(F);

{////////////////////////////////////////////////////////////////////////////}


writeln;
writeln;


     for i:=1 to n do
         begin
              for j:=1 to m do
                  begin
                       opn:=0;
                       forw(i,j);
                  end; writeln;
         end;


     for i:=1 to n do
         begin
              for j:=1 to m do
                  begin
                       write(b[i,j]);
                  end; writeln;
         end;
         writeln;

         writeln(min);
readkey;
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.