Ivs: спираль, но код покомпактней малость
Код
program Spiral;
var
 Mas: Array[1..n, 1..n] of Integer;
 i, x, g, e, s: Integer;
  
begin
 g := 0;
 e := n + 1;
 s := 0;
 x := 0;
 repeat
  Inc(s);
  Inc(g);
  Dec(e);
  for i := g to e do begin Inc(x); Mas[s, i] := x; end;
  for i := s + 1 to e do begin Inc(x); Mas[i, e] := x; end;
  for i := e - 1 downto g do begin Inc(x); Mas[e, i] := x; end;
  for i := e - 1 downto s + 1 do begin Inc(x); Mas[i, s] := x; end;
 until x = Sqr(n);
 WriteLn;
 for i := 1 to n do begin
  for x := 1 to n do Write(Mas[i, x]:5, ' ');
  WriteLn;
 end;
 ReadLn
end.
Добавлено (13.01.03 20:58):Ivsа с обменом в массиве ты эмулировал сдвиг я понял. эта мысль мне в голову пришла первой, но никогда не задумывался об эффективности?! при таком подходе используется m * n перестановок! можно сделать за n! я сам ещё не доделал эту фишку (сессия фигова)
Удачи
Добавлено (14.01.03 22:42):IvsКод
program Perestanovka;
const
 n = 9;
 m = 8;
 k = n - m;
var
 A: Array[1..n] of Byte;
 t1, t2: Byte;
 i, nInd, Ind, cob: Integer;
begin
 for i := 1 to n do begin A[i] := i; Write(A[i], ' '); end;
 
 cob := 0;
 nInd := cob;
 if (m > 0) and (m <> n) then
 if n mod m = 0 then
 for i := 1 to m do
  begin
   Ind := i;
   t2 := A[i];
   repeat
    t1 := t2;
    if Ind <= m then Inc(Ind, k) else Dec(Ind, m);
    t2 := A[Ind];
    A[Ind] := t1;
   until Ind = i;
  end else
  begin
   repeat
    Inc(nInd);
    t2 := A[nInd];
    Ind := nInd;
    repeat
     Inc(cob);
     t1 := t2;
     if Ind <= m then Inc(Ind, k) else Dec(Ind, m);
     t2 := A[Ind];
     A[Ind] := t1;
    until (Ind = nInd) or (cob = n);
   until cob = n;
  end;
 WriteLn;
 for i := 1 to n do Write(A[i], ' ');
 
 ReadLn
end.
Вот этот алгоритм выполняет требуемые действия за n перестановок твой же за m * n! Я прогнал на время (по 30000000 циклов) каждый алгоритм!
Вот результаты:
Брал пограничные значения m (то есть 1 и n - 1) и n = 9
При m = 1 твой алгоритм опережал мой на 2 секунды!( это из-за большего числа разных условий и дополнительных операций в моей реализации, следовательно если юзаешь только одиночные сдвиги, то твой предпочтительней потому что он проще и быстрее, но мой надо использовать при сдвигах больших единицы (для этой цели он собственно и кодился!!!) )
При m = 8 мой алгоритм опережал твой на 16 секунд! Вот такие дела! Кстати ты не знаешь как узнать дату последнего выключения компа???Очень надо!