Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 21:16   #1
POCOMAXA
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 17
Восклицание заполнение по спирали снизу слева(pascal)

помогите разобраться, каким образом можно заполнить двумерный массив[n строк, m столбцов] по спирали цепочкой цифр от 1 до n*m. начинать заполнение нужно внутрь против часовой стрелки, с левой нижней ячейки.
напишите кто знает сам алгоритм заполнения. Заранее спасибо
POCOMAXA вне форума Ответить с цитированием
Старый 03.10.2012, 21:30   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А что говорит поиск?
Гляньте тут
Или в низу похожие темы.
Poma][a вне форума Ответить с цитированием
Старый 03.10.2012, 21:56   #3
POCOMAXA
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 17
По умолчанию

Цитата:
А что говорит поиск?
Гляньте тут
Или в низу похожие темы.
Код:
var
  a:array[1..100,1..100]of integer;
  i,imax,imin,j,jmax,jmin,k,m,n:integer;
begin
  write('Vvedite 4islo strok: ');
  readln(m);
  write('Vvedite 4islo stolbcov: ');
  readln(n);
  jmin:=1;
  jmax:=n;
  imin:=2;
  imax:=m;
  k:=0;
  repeat
    for j:=jmin to jmax do
    begin
      inc(k);
      a[imin-1,j]:=k;
    end;
    for i:=imin to imax do
    begin
      inc(k);
      a[i,jmax]:=k;
    end;
    dec(jmax);
    for j:=jmax downto jmin do
    begin
      inc(k);
      a[imax,j]:=k;
    end;
    dec(imax);
    for i:=imax downto imin do
    begin
      inc(k);
      a[i,jmin]:=k;
    end;
    inc(imin);
    inc(jmin);
  until k>=m*n;
  for i:=1 to m do
  begin
    writeln;
    for j:=1 to n do write(a[i,j]:3);
  end;
  readln;
end.
нашел только похожую, здесь заполнение идет с верхнего левого и по часовой, кто бы подсказал, как начать заполнять с нижнего левого и против часовой. помогите изменить выделенный кусочек

Последний раз редактировалось POCOMAXA; 03.10.2012 в 22:16.
POCOMAXA вне форума Ответить с цитированием
Старый 03.10.2012, 22:45   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

У меня есть решение. Оно менее красиво, зато свое, родное
Код:
const
    n0 = 360;(*максимальный размер матрицы, при большем размере программа занимает в памяти больше 16 мб, что недопустимо*)
    m0 = 360;
 
type
    mas = array[1..n0, 1..m0] of 0..n0 * m0;
 
var
    a : mas;
    n, m, i, j : longint;
    s : string;
 
{1-right
2-down
3-left
4-up} (*направление для заполнения*)
 
procedure print(z : byte); (*выводит матрицу на экран*)
begin
    for i := 1 to n do
    begin
        for j := 1 to m do
            write(a[i, j]:z);
        writeln;
    end;
end;
 
procedure install(var a:mas;i,y,x,c:longint); (*процедура, заполняющая матрицу*)
begin
    if i <= n*m then
        case c of
        1:
            if (x + 1 <= m) and (a[y, x + 1] = 0) then
            begin
                a[y, x + 1] := i;
                install(a, i + 1, y, x + 1, c);
            end else install(a, i, y, x, 4);
        2:
            if (y + 1 <= n) and (a[y + 1, x] = 0) then
            begin
                a[y + 1, x] := i;
                install(a, i + 1, y + 1, x, c);
            end else install(a, i, y, x, 1);
        3:
            if (x - 1 >= 1) and (a[y, x - 1] = 0) then
            begin
                a[y, x - 1] := i;
                install(a, i + 1, y, x - 1, c);
            end else install(a, i, y, x, 2);
        4:
            if (y - 1 >= 1) and (a[y - 1, x] = 0) then
            begin
                a[y - 1, x] := i;
                install(a, i + 1, y - 1, x, c);
            end else install(a, i, y, x, 3);
        end;
end;
 
begin
    fillchar(a, sizeof(a), 0);
    readln(n, m);
    install(a, 1, n, 0, 1);
    str(n * m, s);
    print(length(s) + 1); (*параметр указывает на место, отведенное для каждого числа*)
    readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 03.10.2012 в 22:53.
BDA на форуме Ответить с цитированием
Старый 03.10.2012, 22:55   #5
MadHamster
Пользователь
 
Аватар для MadHamster
 
Регистрация: 13.01.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от POCOMAXA Посмотреть сообщение
помогите изменить выделенный кусочек
Код:
  repeat
    for j:=jmin to jmax do
    begin
      inc(k);
      a[imax,j]:=k;
    end;
    dec(imax);
    for i:=imax downto imin do
    begin
      inc(k);
      a[i,jmax]:=k;
    end;
    dec(jmax);
    for j:=jmax downto jmin do
    begin
      inc(k);
      a[imin,j]:=k;
    end;
    inc(imin);
    for i:=imin to imax do
    begin
      inc(k);
      a[i,jmin]:=k;
    end;
    inc(jmin);
  until k>=m*n;
Как-то так.
MadHamster вне форума Ответить с цитированием
Старый 04.10.2012, 11:18   #6
POCOMAXA
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
У меня есть решение. Оно менее красиво, зато свое, родное
мне нужно сделать с помощью циклов. но все равно спасибо
POCOMAXA вне форума Ответить с цитированием
Старый 04.10.2012, 11:20   #7
POCOMAXA
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 17
По умолчанию

Цитата:
Сообщение от MadHamster Посмотреть сообщение
Код:
  repeat
    for j:=jmin to jmax do
    begin
      inc(k);
      a[imax,j]:=k;
    end;
    dec(imax);
    for i:=imax downto imin do
    begin
      inc(k);
      a[i,jmax]:=k;
    end;
    dec(jmax);
    for j:=jmax downto jmin do
    begin
      inc(k);
      a[imin,j]:=k;
    end;
    inc(imin);
    for i:=imin to imax do
    begin
      inc(k);
      a[i,jmin]:=k;
    end;
    inc(jmin);
  until k>=m*n;
Как-то так.
runtime error 201, что-то здесь не учтено.
POCOMAXA вне форума Ответить с цитированием
Старый 04.10.2012, 11:27   #8
MadHamster
Пользователь
 
Аватар для MadHamster
 
Регистрация: 13.01.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от POCOMAXA Посмотреть сообщение
runtime error 201, что-то здесь не учтено.
Код:
imin:=2;
Поменяйте на
Код:
imin:=1;
MadHamster вне форума Ответить с цитированием
Старый 04.10.2012, 12:18   #9
POCOMAXA
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 17
Хорошо

Цитата:
Сообщение от MadHamster Посмотреть сообщение
Код:
imin:=2;
Поменяйте на
Код:
imin:=1;
Спасибо. Работает.
POCOMAXA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
заполнение матрици по спирали, числами от 1 до n Sylar9 Общие вопросы C/C++ 4 06.09.2012 22:13
заполнение матрицы по спирали!!!!! Jenn Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 08.01.2012 10:52
Работа с матрицами, заполнение по спирали, С++ Niconov Помощь студентам 0 05.12.2011 18:20
Заполнение квадрата 6х6 по спирали artacer Паскаль, Turbo Pascal, PascalABC.NET 8 10.06.2011 01:14
Заполнение квадратной матрицы по спирали [Delphi] willams Помощь студентам 2 13.12.2010 09:05