Sahsok В общем сделал я универсальный алгоритм, заполняющий матрицу так, как тебе нужно... Но боюсь сложновато будет для первокурсника... Будут вопросы - задавай.
Код
Uses Crt;
Const
m = {11}5;
Var
mat: Array[1 .. m, 1 .. m] Of Byte;
f_name: String;
f: Text;
T, n, j, curr_x, curr_y: integer;
up, back: boolean;
count, started: integer;
procedure printmatrix(cx, cy: integer);
var i, j: integer;
begin
clrscr;
for i := 1 to m do
begin
for j := 1 to m do
begin
(* Это только для проверки работоспособности *)
if mat[i, j] = 0 then textcolor(lightgray)
else textcolor(mat[i, j] + 1);
(* проверка *)
write(mat[i, j]:2);
(* Это только для проверки работоспособности *)
textcolor(lightgray);
(* проверка *)
end;
writeln
end;
writeln(f, '(', cx, ',', cy, ')');
readln
end;
begin
ClrScr;
Write('File Name: '); ReadLn(f_name);
Assign(f, f_name);
ReWrite(f);
FillChar(mat, sizeof(mat), 0);
{ Здесь должен быть ввод значений }
{ Part I }
n := Trunc(Sqrt(m));
up := True;
count := 0;
curr_x := m; curr_y := m;
While curr_x > 0 Do
Begin
mat[curr_y, curr_x] := 1; T := curr_y;
printmatrix(curr_y, curr_x);
Inc(count);
If count = n Then
Begin
count := 1;
up := not up
End;
Dec(curr_x); Inc(curr_y, 1 - 2*Byte(up))
end;
{ Part II }
For j := Pred(T) DownTo Succ(Succ(m) div 2) Do
Begin
mat[j, 1] := 2; printmatrix(j, 1)
End;
{ Part III }
For curr_y := Succ(m) div 2 DownTo 1 Do
For curr_x := 1 To curr_y Do
Begin
mat[curr_y, curr_x] := 3;
printmatrix(curr_y, curr_x)
End;
{ Part IV }
n := Pred(m) div 2;
up := False; back := False;
count := 0; started := 2;
curr_x := started; curr_y := 1;
While True Do
Begin
If back Then
Begin
While curr_x > Succ(started) Do
Begin
Dec(curr_x);
mat[curr_y, curr_x] := 4;
printmatrix(curr_y, curr_x)
End;
back := False; Dec(n, 2); Inc(started, 2);
Inc(curr_x); Inc(curr_y); up := False; count := 0
End;
If n = 0 Then Break
Else
If n = 1 Then
Begin
mat[curr_y, curr_x] := 4;
printmatrix(curr_y, curr_x);
break
End;
mat[curr_y, curr_x] := 4;
printmatrix(curr_y, curr_x);
Inc(count);
If count = n Then
Begin
count := 1;
If up Then
Begin
back := true;
continue
End;
up := not up
End;
Inc(curr_x); Inc(curr_y, 1 - 2*Byte(up))
End;
Close(f)
end.
Примечания:
1) данные в матрицу не вводятся, основной задачей было создание необходимой траектории обхода;
2) 4 участка траектории обозначаются соответствующими цифрами;
3) после вывода очередной цифры - нажимаем "Enter" для продолжения;
4) в текущей директории создается текстовый файл с введенным именем, содержащий координаты точек траектории.
Вроде бы всё... :D