Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1 / 0 / 0
Регистрация: 18.11.2009
Сообщений: 10

Заполнить матрицу от левого верхнего угла по спирали: вниз-вправо-вверх-влево

18.11.2009, 15:01. Показов 2952. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заполнить матрицу ЛП, от левого верхнего угла по спирали: вниз-вправо-вверх-влево
Сама матрица:

1323102928272625
23356555453525124
33457727170695023
43558738079684922
52659748178674821
63760757677664720
73861626354654619
83940914243444518
910111121314151617

[404]

буду благодарен за помощь
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2009, 15:01
Ответы с готовыми решениями:

Заполнить матрицу от центра по спирали: вниз - влево - вверх - вправо
Заполнить матрицу ЛП, от центра по спирали: вниз - влево - вверх - вправо.

Составить программу движения круга вверх, вниз, влево, вправо в зависимости от нажатия клавиш
Задача: Вроде как тему "функции readkey и keypressed' более менее понял, но завис буквально на первой задаче... Вот код, который я...

Заполнение матрицы по спирали (от левого верхнего элемента по часовой стрелке)
Надо заполнить числа спиралью, помогите (чем проще, тем лучше). ПРИМЕР : 1 2 3 4 5 16 17 18 19 6 15 ...

6
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
18.11.2009, 16:15
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
uses crt;
var a:array[1..20,1..20]of integer;
    n,i,j:integer;
    x,y,num,add,dir:integer;
begin
clrscr;
write('n=');readln(n);
x:=1;//начало движения 1-й столбец, 0-я строка
y:=0;
num:=1;//номер=1
Add:=n;//начальная длина пути
dir:=1;//знак+
while (add<>0) do
begin
  i:=0;
  while (i<>add) do
    begin
    y:=y+dir;//идем вниз, потом вверх по столбцу
    a[y,x]:=num;
    num:=num+1;
    i:=i+1;
    end;
  i:=0;
  add:=add-1;
  while (i<>add) do
    begin
    x:=x+dir;//по строке сначала вправо, потом влево
    a[y,x]:=num;
    num:=num+1;
    i:=i+1;
    end;
  dir:=dir*(-1);//меняем знак
end;
for i:=1 to n do
   begin
     for j:=1 to n do
     write(a[i,j]:4);
     writeln;
   end;
readln
end.
3
1 / 0 / 0
Регистрация: 18.11.2009
Сообщений: 10
19.11.2009, 14:58  [ТС]
Спасибо тебе большое!!!!!
0
0 / 0 / 0
Регистрация: 10.01.2016
Сообщений: 5
06.02.2018, 00:23
Для более 20-ти строк и столбцов не работает! Может быть знающие форумчане поправят код?!
0
Модератор
10434 / 5722 / 3405
Регистрация: 17.08.2012
Сообщений: 17,411
06.02.2018, 04:40
Tutius, а самому подкорректировать строку 2? Не вариант или религия не позволяет?
1
0 / 0 / 0
Регистрация: 10.01.2016
Сообщений: 5
06.02.2018, 23:40
Cyborg Drone, спасибо за то, что указали на мой промах -наверное уже просто устал: решал допоздна и глаз "замылился"... Моя задача была похожая - вот условие: Заполните массив из 28 строк и 27 столбцов по спирали вниз натуральными числами, начиная с 23. Найдите сумму элементов фрагмента матрицы, верхний левый угол которого находится в пятой строке и шестом столбце, а правый нижний угол совпадает с правым нижним углом матрицы.
Взял код из данной ветки, немного переработал:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const
     n=28;
var a:array[1..1000,1..1000]of integer;
    s,k,i,j:integer;
    dsr,x,y,num,ds,d:integer;
begin
x:=1;//начало движения 1-й столбец, 0-я строка
y:=0;
num:=23;//первый элемент массива
ds:=n;//начальная длина пути - начальная высота столбца
dsr:=n-2;// строка(кол-во элементов)
d:=1;//приращение по оси 0Y и знак "+/-" - отвечает за изменение направления заполнения
//=============== заполняем массив ======================
while (ds-1<>0) do
begin
// ============ заполняем текущий столбец ============
  i:=0;
  while (i<>ds) do
    begin
    y:=y+d;//идем вниз, потом вверх по столбцу
    a[y,x]:=num;
    num:=num+1;
    i:=i+1;
    end;
  i:=0;
  ds:=ds-1;
//========= заполняем текущую строку ===========================
  while (i<>dsr) do
    begin
    x:=x+d;//по строке сначала вправо, потом влево
    a[y,x]:=num;
    num:=num+1;
    i:=i+1;
    end;
    dsr:=dsr-1;
  d:=-d;//меняем знак
end;
//================= выводим на печать ==================
for i:=1 to n do
   begin
     for j:=1 to n-1 do
     write(a[i,j]:4);
     writeln;
   end;
 writeln;
//==============сумма по по внутреннему массиву ===========
      s:=0;
      for i:=5 to n do
          for j:=6 to n-1 do
                             s:=s+a[i,j];
      write('Полученная сумма: ',s);
end.
Но получившийся код, на мой взгляд, получился громоздким, не интуитивно-понятным и "некрасивым". Не хватает опыта написать/переработать выше написанный код для двумерных массивов с разным количеством столбцов и строк. Чтобы не мучиться с различными коэффициентами и переменными - а просто меняя значения столбцов и строк получать результат... Надеюсь - у кого-нибудь получится!
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
08.02.2018, 09:31
Tutius, основная проблема (даже скорее не учащихся, а тех, кто преподаёт) в том, что именование переменных происходит не по смыслу, а по принципу: понадобилась → взяли первую попавшуюся свободную букву и „закодили“.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const
  Rows = 28;
  Cols = 27;
  numStart = 23;
  sumFromRow = 5;
  sumFromCol = 6;
  d = 4;
 
var
  a : array [0..Rows-1, 0..Cols-1] of Integer;
  Num, Row, Col, Invariant, Sum : Integer;
  
begin
  for Row := 0 to Rows-1 do
    for Col := 0 to Cols-1 do
      a[Row,Col] := 0;
      
  Num := numStart; Row := 0; Col := 0; a[Row,Col] := Num;
  Invariant := 0;
  while 1 + Num - numStart <> Rows * Cols do
    case Invariant of
      0 : if (Row+1 < Rows) and (a[Row+1,Col] = 0) then begin Inc(Num); Inc(Row); a[Row,Col] := Num; end else Inc(Invariant);
      1 : if (Col+1 < Cols) and (a[Row,Col+1] = 0) then begin Inc(Num); Inc(Col); a[Row,Col] := Num; end else Inc(Invariant);
      2 : if (Row > 0     ) and (a[Row-1,Col] = 0) then begin Inc(Num); Dec(Row); a[Row,Col] := Num; end else Inc(Invariant);
      3 : if (Col > 0     ) and (a[Row,Col-1] = 0) then begin Inc(Num); Dec(Col); a[Row,Col] := Num; end else Invariant := 0;
    else
      Inc(Num);
    end;
    
  for Row := 0 to Rows-1 do
    begin
      for Col := 0 to Cols-1 do Write(a[Row,Col]:d);
      WriteLn;
    end;
    
  Sum := 0;
  for Row := sumFromRow-1 to Rows-1 do
    for Col := sumFromCol-1 to Cols-1 do
      Inc(sum, a[Row,Col]);
  WriteLn(Sum);
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.02.2018, 09:31
Помогаю со студенческими работами здесь

Заполнение матрицы по спирали (с верхнего левого элемента по часовой стрелке)
нужно расставить элементы матрицы А таким образом: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 ...

Спираль из нижнего левого угла вправо
Помогите сделать спираль из нижнего левого угла вправо

Можно ли определить позицию левого верхнего угла Picture?
Можно ли определить позицию левого верхнего угла Picture? Например функциями: Writeln(Picture.Left); Writeln(Picture.Top); Если...

Изменение размера прямоугольника при фиксированной координате верхнего левого угла
Здравствуйте, помогите пожалуйста с курсовой «Резиновый прямоугольник». Изменение размера прямоугольника при фиксированной координате...

Лабиринт задан двумерным массивом. Из левого верхнего угла лабиринта пройти в правый нижний
Лабиринт задан двумерным массивом. Из левого верхнего угла лабиринта пройти в правый нижний. Массив задается вводом. Элементы, по которым...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru