Tablica dwuwymiarowa - spiralka :)

0

Witam , mam prośbę czy ktoś mogłby podrzucić pomysł jak wypełnić tablicę 10 na 10 po spirali czyli ślimakowato :). na razie coś takiego wyczarowałem :

program spirala_tablica;
uses crt;

var
T : ARRAY [1..10,1..10] of integer;

w,z,a: integer;
z_konc,w_konc: integer;

procedure tablica_zawartosc;
begin
a:=0 ;
for z:=1 to 10 do
begin
a:=a+1 ;
for w:=1 to 10 do
T[w,z]:=a;
end;
end;

procedure pokaz_tablice;
begin
for w:=1 to 10 do
begin
for z:=1 to 10 do
begin
write(T[w,z]:4,' ');
end;
writeln;
end;
end;

begin
clrscr;
tablica_zawartosc;
pokaz_tablice;
readln;
end.

I tutaj już nie wiem kompletnie :)

Proszę o odpowiedź.

Dzięki, postawie komuś [browar] jak pomorze :D

0

czy spiralkowo mam rozumieć

1 2 1 2....
2 1 2 1....
.
.
.
?

0

czyli ma to być tak

1 2 3 4 5 6 7 8 9 10
11
12
13
14
15
16
17
18
...21(20(19

0

czyli że nikt nie pomoże :(

0

W zasadzie AndRew podał link z poprawnym rozwiązaniem, ale pozwolę sobie wstawić tu jeszcze jeden, nieco inny sposób rozwiązania tego problemu:

procedure MacierzSlimakiemWypelnij(Rows: integer);
var
  A: array of array of integer;
  cn, p, i, Max, Min, Ind, cnMax, x1, x2, xVal: integer;
  IsRow, IsAsc: Boolean;

  procedure SaveIt;
  var
    sl: TStringList;
    row, col: integer;
    s: string;
  begin
    sl := TStringList.Create;
    try
      for row := 0 to Length(A) - 1 do
      begin
        s := '';
        for col := 0 to Length(A) - 1 do
        begin
          s := s + IntToStr(A[row, col]) + #9; // #9 - TAB
        end;
        sl.Add(s);
      end;
      sl.SaveToFile('array.txt');
    finally
      sl.Free;
    end;
  end;

begin
  SetLength(A, Rows, Rows);
  Min := 0;
  Max := Rows - 1;
  cnMax := Rows div 2;
  if Odd(Rows) then Inc(cnMax);
  IsRow := True;
  IsAsc := True;
  xVal := 0;

  // cn - numer cyklu
  // w każdym cyklu 4 pętle
  for cn := Min to cnMax do
  begin

    for p := 1 to 4 do
    begin


      // ustalenie zmiennych iteracyjnych x1 i x2
      if IsRow then

        if IsAsc then
        begin
          x1 := Min + (cn - 1);
          x2 := Max - (cn - 1);
        end
        else
        begin
          x1 := Max - cn;
          x2 := Min + (cn - 1);
        end

      else // not IsRow

        if IsAsc then
        begin
          x1 := Min + cn;
          x2 := Max - (cn - 1);
        end
        else
        begin
          x1 := Max - cn;
          x2 := Min + cn;
        end;

      // ustalenie indexu
      if (IsRow and IsAsc) or ((not IsRow) and (not IsAsc)) then
        Ind := cn - 1
      else
        Ind := Max - cn + 1;


      if (Ind > Max) or (Ind < Min) then Break;


      // zapis wartości
      if IsAsc then

        for i := x1 to x2 do
        begin
          Inc(xVal);
          if IsRow then
            A[Ind, i] := xVal
          else
            A[i, Ind] := xVal;
        end

      else // not IsAsc

        for i := x1 downto x2 do
        begin
          Inc(xVal);
          if IsRow then
            A[Ind, i] := xVal
          else
            A[i, Ind] := xVal;
        end;


      if p mod 2 = 0 then IsAsc := not IsAsc;
      IsRow := not IsRow;

    end; // for p
  end; // for cn

  SaveIt;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1