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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2017, 17:13   #1
pal_palich
Новичок
Джуниор
 
Регистрация: 26.03.2017
Сообщений: 3
Сообщение Обход матрицы по спирали

Добрый вечер, не могу решить задачу:
Дана матрица 13*13 обойти по спирали от центра выводя значения ячеек.

Основу написал, примерно сделал что бы обходила, но работает не так как хотелось бы, то ячейку перепрыгивает, то угол не выводит.

Помогите, пожалуйста.

Архив с программой прикрепил.
Вложения
Тип файла: zip Матрица по спирали.zip (235.7 Кб, 15 просмотров)
pal_palich вне форума Ответить с цитированием
Старый 27.03.2017, 10:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

простите, не смотрел Ваш код, просто хочу спросить - а Вы поиском по форуму не хотите воспользоваться? Дело в том, что эта задача на форуме неоднократно решалась (в той или иной модицикации). Поэтому, взять за основу работающий код, возможно будет проще, чем написать/отладить свой.

p.s. если Вы принципиально не хотите использовать чужое решение,
то тогда Вы молодец! А мой пост можно игнорировать!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.03.2017, 14:08   #3
pal_palich
Новичок
Джуниор
 
Регистрация: 26.03.2017
Сообщений: 3
По умолчанию

Другие решения смотрел, давно еще, но не понял кода, да и учителя не устраивает те решения
pal_palich вне форума Ответить с цитированием
Старый 27.03.2017, 14:39   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от pal_palich Посмотреть сообщение
Другие решения смотрел, давно еще, но не понял кода, да и учителя не устраивает те решения
ну, вот в этой теме:

Заполнить массив по спирали

предложено ДВА разных варианта решения.

Вам оба не подходят/не устраивают?

вот код для вашей кнопки "Заполнить":

Код:
procedure TForm1.Button2Click(Sender: TObject);

const n = 13;
var
  i, j, min_i, min_j, max_i, max_j, d, a : integer;
begin
  memo1.Lines.clear;

  i:=n div 2;
  j:=n div 2; // начинаем в центре
  // задаем границы движения
  min_i:=i; max_i:=i; // влево вправо
  min_j:=j; max_j:=j; // вверх вниз
  d:=0; // сначала пойдем влево
  for a:=1 to n*n do begin
    // m[i,j]:=a; // заполняем (нумеруем)
    memo1.lines.Add(stringgrid1.Cells[j,i]); // выводим значение ячейки
    case d of //вычисляем следующую (находим новые i j)
    0: begin
         i:=i-1;  // движение влево
         if i<min_i // проверка выхода за заполненную центральную часть слева
                   then begin
                     d:=1;// меняем направление
                     min_i:=i;// увеличиваем заполненную часть влево
                   end;
       end;
    1: begin // движение вверх проверка сверху
         j:=j-1;
         if j<min_j then begin d:=2; min_j:=j; end;
       end;
    2: begin // движение вправо проверка справа
         i:=i+1;
         if i>max_i then begin d:=3; max_i:=i; end;
       end;
    3: begin // движение вниз проверка снизу
         j:=j+1;
         if j>max_j then begin d:=0; max_j:=j; end;
       end;
    end;
  end;

end;

p.s. для удобства проверки/отладки вместо рандомного заполнения матрицы лучше использовать заполнение порядковыми числами.
например:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var r,c:integer;
begin
for c:=0 to stringgrid1.colcount-1 do
 for r:=0 to stringgrid1.rowcount-1 do
 begin
   stringgrid1.Cells[c,r]:= IntToStr(r*stringgrid1.rowcount+1+c);
 end;
end;

Последний раз редактировалось Serge_Bliznykov; 27.03.2017 в 14:52.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.03.2017, 15:42   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

держи еще (твой переработанный)
что бы не мучится с проверкой правильности расчета индексов
добавлена "куча" "говорящих" переменных для постоянного контроля линий обхода.
Код:
leftM, rightM, topN, bottomN; byte;
в результате циклы стали проще и очевидней.
и для удобства контроля работы случайное заполнение заменено на пару значений (номер_строки. номер_колонки ).
Вложения
Тип файла: zip Сжатая ZIP-папка.zip (1.7 Кб, 19 просмотров)
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 28.03.2017, 13:24   #6
pal_palich
Новичок
Джуниор
 
Регистрация: 26.03.2017
Сообщений: 3
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
держи еще (твой переработанный)
что бы не мучится с проверкой правильности расчета индексов
добавлена "куча" "говорящих" переменных для постоянного контроля линий обхода.
Код:
leftM, rightM, topN, bottomN; byte;
в результате циклы стали проще и очевидней.
и для удобства контроля работы случайное заполнение заменено на пару значений (номер_строки. номер_колонки ).
Спасибо, этот вариант оказался самым подходящим, и код понятен и работает как надо
pal_palich вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
заполнение матрицы по спирали!!!!! Jenn Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 08.01.2012 10:52
Обход по спирали Николай_92 Помощь студентам 1 25.12.2010 11:11
вывод матрицы по спирали С++ Poccoxa Помощь студентам 1 29.10.2010 18:37
Формирование матрицы по спирали RomT24 Помощь студентам 5 18.01.2010 02:38
Чтение матрицы по спирали AlexLAN Общие вопросы C/C++ 1 21.12.2008 07:50