Заполнение матрицы по спирали

1. BBF874 21.04.19 09:33 Сейчас в теме
Нужен цикл для заполнения матрицы по спирали, начало с первой строки. Количество строк и колонок задается пользователем, сам не силен в таких темах(
+
По теме из базы знаний
Найденные решения
11. asdfgcom 415 21.04.19 14:33 Сейчас в теме
условия выхода поставь после каждого цикла
Прикрепленные файлы:
Матрица по спирали.epf
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. spacecraft 21.04.19 14:47 Сейчас в теме
(1) как вариант с одним циклом:
КоличествоКолонок = 6;
КоличествоСтрок = 5;
Матрица = Новый Массив(КоличествоКолонок, КоличествоСтрок);
ТекСтрока = 0;
ТекКолонка = 0;
Х = 1;
У = 0;
С = 0;
Позиции = КоличествоСтрок;
КоличествоЭлементовМассива = КоличествоКолонок*КоличествоСтрок;
к = 0;
Пока к < КоличествоЭлементовМассива Цикл
	к = к +1;
	Матрица[ТекКолонка][ТекСтрока] = к;
	Позиции = Позиции-1;
	Если Позиции <= 0 Тогда
		Позиции = КоличествоСтрок * (С %2) + КоличествоКолонок * ((С+1)%2) - (С/2 - 1) - 2;
		т = Х;
		Х = -У;
		У = т;
		С = С + 1;
	КонецЕсли;
	ТекСтрока = ТекСтрока + Х;
	ТекКолонка = ТекКолонка + У;
КонецЦикла;
Показать
+
13. asdfgcom 415 21.04.19 14:57 Сейчас в теме
(12) Работает. Этот вариант красивее.
Но автор ветки вряд-ли поймет это:
        Позиции = КоличествоСтрок * (С %2) + КоличествоКолонок * ((С+1)%2) - (С/2 - 1) - 2;
+
2. asdfgcom 415 21.04.19 10:14 Сейчас в теме
Здесь не один цикл. Чувствую их целых 5.
+
3. BBF874 21.04.19 11:39 Сейчас в теме
(2)Есть варианты с чего начать?
+
4. tusv 211 21.04.19 12:01 Сейчас в теме
(3) Ну. На вскидку. Обход по счётчику с шагом
Шаг =5;
Для Сч =0 по Тз.Количество()-1 Цикл
   //Бла бла бла
   Сч = Сч+Шаг ;
КонецЦикла;
+
5. asdfgcom 415 21.04.19 12:30 Сейчас в теме
(3)
&НаКлиенте
Процедура Команда1(Команда)
	ВсегоСтолбцов = 5;
	ВсегоСтолбцов1 = 5;
	ВсегоСтрок = 4;
	ВсегоСтрок1 = 4;
	
	НачСтолбец = 1;
	начстрока = 1;
	
	м = Новый массив(ВсегоСтолбцов+1,ВсегоСтрок+1);
	сч = 1;
	//Внешний цикл
	Пока Истина Цикл
		
		//строка от начала до конца
		Для стл = НачСтолбец По ВсегоСтолбцов Цикл
			м[стл][НачСтрока] = сч;	
			сч = сч + 1;
		КонецЦикла;
		начстрока = начстрока + 1;
		
		//столбец от начала до конца
		Для стр = НачСтрока По ВсегоСтрок Цикл
			м[ВсегоСтолбцов][стр] = сч;
			сч = сч + 1;
		КонецЦикла;
		ВсегоСтолбцов = ВсегоСтолбцов - 1;
		
		//строка обратно
		стл = ВсегоСтолбцов;
		Пока стл >= НачСтолбец Цикл 
			м[стл][ВсегоСтрок] = сч;	
			стл = стл-1;
			сч = сч + 1;
		КонецЦикла;
		ВсегоСтрок = ВсегоСтрок - 1;
		
		//столбец обратно
		стр = ВсегоСтрок;
		Пока стр >= НачСтрока Цикл 
			м[НачСтолбец][стр] = сч;	
			стр = стр-1;
			сч = сч + 1;
		КонецЦикла;
		НачСтолбец = НачСтолбец + 1;
		
		Если НачСтолбец >= ВсегоСтолбцов И начстрока >= ВсегоСтрок Тогда
			Прервать;
		КонецЕсли;		
	КонецЦикла;

//Вывод результата
	Для к = 1 По ВсегоСтрок1 Цикл
		Стр = "";
		Для н = 1 По ВсегоСтолбцов1 Цикл
			Стр = Стр + Строка(м[н][к]) + ","; 	
		КонецЦикла;
		Сообщить(стр);
	КонецЦикла;	
КонецПроцедуры
Показать
+
10. BBF874 21.04.19 13:37 Сейчас в теме
(5)Это почти работает, но есть расклад при котором количество строк и столбцов могут быть разными
и тогда он не выводит корректно, например так
1,2,3,4,
20,21,22,5,
19,32,23,6,
18,33,37,7,
38,34,36,8,
16,35,26,9,
15,28,27,10,
14,13,12,11,
Показать
+
6. asdfgcom 415 21.04.19 12:30 Сейчас в теме
Результат:
1,2,3,4,5,
14,15,16,17,6,
13,20,19,18,7,
12,11,10,9,8,
+
7. asdfgcom 415 21.04.19 12:31 Сейчас в теме
Заполнял змейкой с увеличением на 1 по спирали матрицу 5х4
Массив в 1С начинается с 0, но я хотел чтобы все считалось с единицы. Поэтому во всех строках массива столбец[0] будет пустым.
+
8. asdfgcom 415 21.04.19 12:31 Сейчас в теме
Пока обновляется, все-равно заняться нечем было )))
+
9. BBF874 21.04.19 13:06 Сейчас в теме
(8)У меня примерно так получается,
	НачСтолбец = 1;
    НачСтрока = 1;
	    ВсегоСтолбцов1 = Строк-1;
    ВсегоСтрок1 = Столбцов-1;
	сч = 1;
    //Внешний цикл
    Пока Истина Цикл
        
        //строка от начала до конца
        Для стл = НачСтолбец По Столбцов Цикл
           ТЗ[стл][Строк] = сч;    
            сч = сч + 1;
        КонецЦикла;
        НачСтрока = НачСтрока + 1;
        
        //столбец от начала до конца
        Для стр = НачСтрока По Строк Цикл
           ТЗ[Столбцов][стр] = сч;
            сч = сч + 1;
        КонецЦикла;
        Столбцов = Столбцов - 1;
        
        //строка обратно
        стл = Столбцов;
        Пока стл >= НачСтолбец Цикл 
            ТЗ[стл][Строк] = сч;    
            стл = стл-1;
            сч = сч + 1;
        КонецЦикла;
        Строк = Строк - 1;
        
        //столбец обратно
        стр = Строк;
        Пока стр >= НачСтрока Цикл 
            ТЗ[НачСтолбец][стр] = сч;    
            стр = стр-1;
            сч = сч + 1;
        КонецЦикла;
        НачСтолбец = НачСтолбец + 1;
        
        Если НачСтолбец >= Столбцов И НачСтрока >= Строк Тогда
			//Прервать;
        КонецЕсли;        
    КонецЦикла;

//Вывод результата
    Для к = 1 По ВсегоСтрок1 Цикл
        Стр = "";
        Для н = 1 По ВсегоСтолбцов1 Цикл
            Стр = Стр + Строка(ТЗ[н][к]) + ",";     
		КонецЦикла;
        Сообщить(стр);
    КонецЦикла; 
Показать


Строк и столбцов задаются пользователем, но выдает ошибку {ВнешняяОбработка.NewMassiv.Форма.Форма.Форма(526)}: Индекс находится за границами массива
ТЗ[стл][Строк] = сч;
+
11. asdfgcom 415 21.04.19 14:33 Сейчас в теме
условия выхода поставь после каждого цикла
Прикрепленные файлы:
Матрица по спирали.epf
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот