Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на 2х мерный массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Sahsok
Исходные данные:
1.квадратная нечетная матрица размернастью (m x m ); Минимальный размер 5х5 максимальный 21х21.
2.начальные элементы матрицы нулевые.
3. троектория обхода матрицы на рисунке


Программа должна обеспечивать: 1. Ввод даных с клавиатуры. 2. Вывод заданой матрицы на экран с последующим изображением процесса обхода заданной троектории. 3 Вывод в файл значений обхода матрицы (их координат), при этом имя файла вводится с клавиатуры.


П.с. если задать размер отличный от того, который на рисунке,троектория должна возрасти соответственно размерам.

P.p.s У меня в субботу пересдача, а меня без этой задачи на экзамен не пустят. Краем глаза видел экзаменационные билеты: ТАКОГО там точно нет. Я не могу понять к чему такие задачи дают на специальности, которые к компам имеют косвенное отношение.
dushik
Обход в твоей задаче состоит из четырех частей:
1. "бугорки" внизу матрицы.
2. Вертикальная "палка" слева (хотя это обходом можно и не считать).
3. "Ступеньки" в левом верхнем углу.
4. И треугольник вверху.

Я зделал первые три пункта, последний, скажу честно, лень. Просто вижу никто не торопится тебе делать задачу, так что на хотя бы это:
Код

Uses CRT;

Const
   m = 11;

Var
   mat   : Array [1..m, 1..m] of Byte;
   FName : String;
   F     : Text;
   i, j  : Integer;
   n, k  : Integer;
   l     : Integer;
   flag  : Boolean;

Begin
   ClrScr;
   Write('File Name: ');
   ReadLn(FName);
   Assign(F, FName);
   ReWrite(F);
   For i := 1 to m do
   Begin
       For j := 1 to m do
       Begin
           mat[i, j] := 0;
       End;
   End;
   n    := Round(m / 4);
   i    := m;
   j    := m;
   flag := True;
   l    := 0;
   While (j > 0) do               {obhod 1}
   Begin
       if (flag) Then
       Begin
       if (l = 0) Then
       Begin
           for k := i DownTo i-n+1 do
           Begin
               mat[k, j] := 1;
               j := j - 1;
           End;
           i := k+1;
       End
           Else
       Begin
           for k := i DownTo i-n+2 do
           Begin
               mat[k, j] := 1;
               j := j - 1;
               WriteLn(F, '(', k, ';', j, ')');
           End;
           i := k+1;
       End;
       End
           Else
       Begin
           for k := i To m do
           Begin
               mat[k, j] := 1;
               j := j - 1;
               l := l + 1;
               WriteLn(F, '(', k, ';', j, ')');
           End;
           i := k - 1;
       End;
       flag := not flag;
   End;                           {konez 1-ogo obhoda}

   n := (m div 2) + 1;            {2-oy obhod}
   j := 1;
   for i := k DownTo n do
   Begin
       mat[i, j] := 1;
       WriteLn(F, '(', i, ';', j, ')');
   End;

   l := n - 1;                    {3-iy obhod}
   for k := 1 to l do
   Begin
       for j := 1 to n do
       Begin
           mat[i, j] := 1;
           WriteLn(F, '(', i, ';', j, ')');
       End;
       i := i - 1;
       n := n - 1;
   End;
   mat[1, 1] := 1;
   WriteLn(F, '(1;1)');

   For i := 1 to m do
   Begin
       WriteLn;
       For j := 1 to m do
       Begin
           if (mat[i, j] = 1) Then
               TextColor(Green)
           Else
               TextColor(White);
           Write(mat[i, j], '|');
       End;
   End;
   ReadLn;
   Close(F);
End.
volvo
Sahsok
Цитата
если задать размер отличный от того, который на рисунке,троектория должна возрасти соответственно размерам.

Вот в этом-то и проблема... Возрасти траектория может, если задать бОльший размер... А если меньший - ... Интересно было бы увидеть траекторию при M = 5.

dushik
Ну я же просил проверять программы перед тем, как сюда постить... А проверять - это не только откомпилировать и убедиться, что программа работает при m = 11...
Цитата
1.квадратная нечетная матрица размернастью (m x m ); Минимальный размер 5х5 максимальный 21х21.

Вводим m = 5... И что имеем? Программа просто виснет (бесконечный цикл). Поэтому-то никто и не торопится сделать программу.
Sahsok
Действительно 11х11 я сам сделал,а с бОльшим и меньшим размером загвоздки.
Мне видется почему-то такой вариант при м=5, опять же воплатить в жизнь его фантазии не хватает.
dushik
А чем вам 5-ка не нравиться, просто без "вертикальной линии" получается.
Думаю она нужна, что бы добраться до середины, для м=5, эта линия равна нулю, потому 5 - минимум.
volvo
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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.