Вход | Регистрация
 

Матрица по спирали

Матрица по спирали
Я
   BBF765
 
21.04.19 - 08:29
Нужен цикл для заполнения матрицы по спирали,с первой строки, количество строк и колонок задается пользователем, нужен именно пример цикла, пока сам не могу прийти к этому, не силен в таких вещах((
 
 
   DJ Anthon
 
1 - 21.04.19 - 08:48
1000 руб.
   EkaterinaS
 
2 - 21.04.19 - 09:26
В интернете есть примеры на других языках. https://renkport.ru/java/primer/zapolnenie-dvumernogo-massiva-po-spirali/
   rphosts
 
3 - 21.04.19 - 09:33
(0) это задача мне попалась на экзамене по фортрану (после первого семестра), а казалась бы не программирование а лишь прикладная математика.... 1990г
"Эх, народец нынче хилый".
   BBF765
 
4 - 21.04.19 - 09:36
Я тоже решал такие задачи будучи студентом, но это давно и свою форму я давно растерял, пытался перевести с языков Java и C++, но успехов это не принесло((
   vde69
 
5 - 21.04.19 - 10:22
(4) так напиши алгоритм РУССКИМ языком, а потом уже переводи в код
   RomanYS
 
6 - 21.04.19 - 10:47
Как вараинт: обошел периметр, далее рекурсия
   rphosts
 
7 - 21.04.19 - 11:18
(6) любая рекурсия заменяется циклом
   RomanYS
 
8 - 21.04.19 - 11:24
(7) Это понятно, но (0) возможно циклы ещё не освоил)
Я бы начал так
Повороты = Новый Структура("Верх,Право,Низ,Лево", "Право", "Низ", "Лево", "Верх");
Шаги = Новый Структура("Верх,Право,Низ,Лево"
    , Новый Структура("X,Y", 1, 0)
    , Новый Структура("X,Y", 0, 1)
    , Новый Структура("X,Y", -1, 0)
    , Новый Структура("X,Y", 0, -1));
Границы = Структура("Верх,Право,Низ,Лево", 0, Колонок - 1, Строк - 1, 0);

ТекАдрес = Новый Структура("X,Y", 0, 0);
Пока (Границы.Верх < Границ.Низ) И (Границы.Лево < Границ.Право) Цикл
    ...
КонецЦикла;
   BBF765
 
9 - 21.04.19 - 11:47
(8)Это то понятно я сам цикл не могу разобрать, неправильно выводит(
   ЕщеОдинПрограммист
 
10 - 21.04.19 - 13:23
(7) не любая, а только в данном контексте. Ветвящаяся нет.
 
 Рекламное место пустует
   dmt
 
11 - 21.04.19 - 14:23
    у = 4;
    х = 5;
    
    м = Новый Массив(у, х);
    
    Для к = 0 по у-1 Цикл
        Для й = 0 По х-1 Цикл
            м[к][й] = к*х + й;
        КонецЦикла; 
    КонецЦикла; 
    
    Сообщить("---------------------");
    
    стКоординаты = Новый Структура();
    стКоордината = Новый Структура("Тек,Нач,Кон", 0, 0, у-1);
    стКоординаты.Вставить("у", стКоордината);
    стКоордината = Новый Структура("Тек,Нач,Кон", 0, 0, х-1);
    стКоординаты.Вставить("х", стКоордината);
    
    соНаправления = Новый Соответствие;
    соНаправления.Вставить(0, Новый Структура("Координата,Знак", "х", 1));
    соНаправления.Вставить(1, Новый Структура("Координата,Знак", "у", 1));
    соНаправления.Вставить(2, Новый Структура("Координата,Знак", "х", -1));
    соНаправления.Вставить(3, Новый Структура("Координата,Знак", "у", -1));
    
    текНаправление = 0;
    текКоордината = соНаправления[текНаправление].Координата;
    
    колПоворотов = 0;
    к = стКоординаты[текКоордината].Нач;
    
    Пока к <= стКоординаты[текКоордината].Кон Цикл
            
        Если соНаправления[текНаправление].Знак = 1 Тогда
            стКоординаты[текКоордината].Тек = к;
        Иначе
            стКоординаты[текКоордината].Тек = (стКоординаты[текКоордината].Кон + стКоординаты[текКоордината].Нач) - к;
        КонецЕсли; 
        
        Сообщить(м[стКоординаты.у.Тек][стКоординаты.х.Тек]);
        
        Если к = стКоординаты[текКоордината].Кон Тогда
            колПоворотов = колПоворотов + 1;
            
            текНаправление = текНаправление + 1;
            Если текНаправление > 3 Тогда
                текНаправление = 0;
            КонецЕсли; 
            
            текКоордината = соНаправления[текНаправление].Координата;
            
            Если соНаправления[текНаправление].Знак = 1 Тогда
                стКоординаты[текКоордината].Нач = стКоординаты[текКоордината].Нач + 1;
            Иначе
                стКоординаты[текКоордината].Кон = стКоординаты[текКоордината].Кон - 1;
            КонецЕсли; 
            
            к = стКоординаты[текКоордината].Нач;
            
        Иначе
            к = к + 1;
        КонецЕсли; 
        
    КонецЦикла; 


   Сияющий в темноте
 
12 - 22.04.19 - 11:33
у нас прямоугольник bottom,left,right,top
направления слева направо по верху
свеху вниз справа
справа налево по низу
снизу вверх слева
проверяем,что есть,что заполнять
слева направо это по top от left до right потом top++
сверху вниз это по right от top до bottom потом right--
справа налево это по bottom от right до left потом bottom--снизу вверх это по left от bottom до top потом left++
условие окончания это right<left или bottom<top

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует