Перейти к содержимому

Как заполнить массив по спирали

  • автор:

Как заполнить массив по спирали

Алгоритм заполнения двумерного массива по спирали

Наверное у многих было задание на уроках программирования, написать программу которая должна заполнить двумерный массив числами по спирали. Недавно у меня тоже появилась необходимость решить данную задачу. Я ее писал много раз на разных языках программирования — и каждый раз приходилось вспоминать, как я ее писал, но теперь я написал алгоритм, который может заполнить любой массив, любого размера — даже не семетричные.

Для начала объясню собственно алгоритм. При заполнении двумерного массива по спирали ( заполнять будем слева-на-право-сверху-вниз ). При заполнении массива улиткой — количество итераций на каждом четвертом проходе будет равно РазмерМассива — 2 . Теперь от этих данных и начнем.

Сперва напишем кусочек кода отвечающий за заполнение только слева-на-право:

if ( y == 0 && x < sizeX - CorrectX && Count 

где y - текущая сторона (0 - вверх, 1 - право, 2 - . )
sizeX - размер массива по горизонтали
CorrectX - переменная, которая отвечает за автоматическое декриментирование
Count - переменная, которая отвечает за текущую цыфру внутри массива
Summ - произведение ширины на высоту, нужно для устранения ошибки (см. Далее)
Mas - название двумерного массива
x - собственно позиция внутри массива

Ну, а остальные стороны делаются по вышеописанному принципу, за тем исключением, что меняются местами переменные, а также немного видоизменяется условие. Если Вы заметили, то было написанно, что переменная Summ, нужна для устранения ошибки - да, так и есть. Ошибка заключается в том, что при последнем цикле первое условии (См. Код) - отрабатывает, а изменить его никак не удавалось, потому пришлось ввести еще одну переменную.

Ниже приведен код функции, которая заполняет массив по спирали. Заполнение происходит только в одном направлении - слева-на-право-сверху-вниз. Ну кто захочет - сможет переписать еe таким образом, чтобы она стартовала откуда угодно. Удачи !

void FillHelix( int **Mas, int sizeY, int sizeX ) < int Summ = sizeX * sizeY; int CorrectY = 0; int CorrectX = 0; int Count = 1; while( sizeY > 0 ) < for ( int y = 0; y < 4; y++ ) < for ( int x = 0; x < ( ( sizeX < sizeY ) ? sizeY : sizeX ); x++ ) < if ( y == 0 && x < sizeX - CorrectX && Count if ( y == 1 && x < sizeY - CorrectY && x != 0 && Count if ( y == 2 && x < sizeX - CorrectX && x != 0 && Count if ( y == 3 && x < sizeY - ( CorrectY + 1 ) && x != 0 && Count > sizeY--; sizeX--; CorrectY += 1; CorrectX += 1; > >

Готовый вариант программы сможете найти, щелкнув в навигационной панели ссылку Готовые программы.

Сайт хостинга © Spyrytus_LTD © 2003 - 2006 гг. Поисковая машина Интернет-магазин CD-дисков

QuadTheMage / Spiral.java

Clone via HTTPS Clone with Git or checkout with SVN using the repository’s web address.

Learn more about clone URLs

Заполнение массива по спирали

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

package com . company ;
/**
* Заполнение массива по спирали
*/
public class Spiral
public static void main ( String [] args )
int row = 11 , col = 11 ;
int [][] array = new int [ row ][ col ];
int minRow = 0 , maxRow = row - 1 , minCol = 0 , maxCol = col - 1 ;
int count = 0 ;
int max = row * col ;
while ( count < max )
for ( int i = minCol ; i <= maxCol ; i ++)
array [ minRow ][ i ] = count ;
count ++;
>
minRow = minRow + 1 ;
for ( int i = minRow ; i <= maxRow ; i ++)
array [ i ][ maxCol ] = count ;
count ++;
>
maxCol = maxCol - 1 ;
for ( int i = maxCol ; i >= minCol ; i --)
array [ maxRow ][ i ] = count ;
count ++;
>
maxRow = maxRow - 1 ;
for ( int i = maxRow ; i >= minRow ; i --)
array [ i ][ minCol ] = count ;
count ++;
>
minCol = minCol + 1 ;
>
for ( int i = 0 ; i < row ; i ++)
for ( int j = 0 ; j < col ; j ++)
System . out . printf ( "%3d " , array [ i ][ j ]);
>
System . out . println ( "" );
>
>
>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Заполнение двумерного массива по спирали СИ

Хочу заполнить двумерный массив по спирали. Ввожу число, затем генерируется двумерный массив, который заполняется от единицы до этого числа. Следующие элементы массива, если они есть, заполняются нулями. Однако, код работает не всегда. Например, если массив 3*4 а введенное число равно 65, результат показывается некорректно. Что в коде не так? `

#include #include void spiral(int array[100][100], int m, int n, int s) < int size, b, x = 0, y = 1, num = 1; size = m*n; for (num=1;num<=size+1;num++) < for (b = x; b < n; b++) < if (num <=s) < array[x][b] = num; num++; >else array[x][b] = 0; > if (num == size + 1) < break; >for (b = y; b < m; b++) < if (num <=s) < array[b][n - 1] = num; num++; >else array[b][n - 1] = 0; > if (num == size + 1) < break; >y++; n--; for (b = n - 1; b > x; b--) < if (num else array[m - 1][b] = 0; > if (num == size + 1) < break; >for (b = m - 1; b > x; b--) < if (num else array[b][x] = 0; > x++; m--; > > int main() < int m, n, s, array[100][100]; srand(time(NULL)); //m=3; // n=4; m = 2 + rand() % 5; n = 2 + rand() % 5; //memset(array, 0, sizeof(array[0][0]) * 10 * 10); printf("enter the number \n"); scanf("%i", &s); spiral(array, m, n, s); for (int i = 0; i < m; i++) < for (int j = 0; j < n; j++) < printf("%i\t", array[i][j]); >printf("\n"); > return (0); >` 

Отслеживать
Altynbek Tanbayev
задан 27 апр 2017 в 15:15
Altynbek Tanbayev Altynbek Tanbayev
45 9 9 бронзовых знаков
Воспользуйтесь дебаггером и найдете проблему.
27 апр 2017 в 15:19
связанный вопрос: Помогите понять код: алгоритм генерации матрицы со спиралью
27 апр 2017 в 17:23
spiral(int array[100][100]. никогда так не делайте в Си.
27 апр 2017 в 18:35

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

int[,] FillMatrixtoSpiral(int row, int col) < int[,] array = new int[row, col]; int Up = 0; // Сужение сверху int Down = 0; // Сужение снизу int Left = 0; // Сужение слева int Right = 0; // Сужение справа // Переменные счетчики используемые в расчетах int k = 1; // Счетчик, который присваивает значение элемнетам массива int i = 0; // Координары строки int j = 0; // Координаты столбца while (k Left) --j; // производится движение по столбцу влево // Проверка возможности движения вверх else --i; // производится движение по строкам вверх // Сужение диапазона, если окружность заполнена if ((i == Up + 1) && (j == Left) && (Left != col - Right - 1)) < ++Up; ++Down; ++Right; ++Left; >++k; // Счетчик увеличен на 1 // Цикл начинается заново > return array; > // Блок вывода элементов двумерного массива void PrintArray(int[,] array) < for (int x = 0; x < array.GetLength(0); ++x) < for (int y = 0; y < array.GetLength(1); ++y) < System.Console.Write(array[x, y] + "\t"); >System.Console.WriteLine(); > > // Основной блок программы int[,] SpiralArray = FillMatrixtoSpiral(4, 4); PrintArray(SpiralArray); 

Отслеживать
ответ дан 9 фев 2023 в 14:31
11 2 2 бронзовых знака
Но вопрос по си.
10 фев 2023 в 5:16

  • c
  • массивы
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Алгоритм спирального заполнения массива

Задача:
Заполнить квадратную матрицу произвольного размера элементами, которые вводит пользователь. Заполнение должно производится по спирали, слева - направо - сверху - вниз.
Для реализации данной задачи использовать язык программирования Java.

Начнем с вопроса о том, чем вообще является массив данных.
В любом языке программирования используются массивы, удобные для работы с большим количеством однотипных данных. Если вам нужно обработать сотни переменных, то вызывать каждую по отдельности становится достаточно трудоемким занятием. В таких случаях проще применить массив. Массивы в Java, как и во многих других языках программирования, обозначаются квадратными скобками. Эти скобки могут располагаться справа от имени массива или от типа объектов, из которых составлен массив.

Рассмотрим пример квадратной матрицы (квадратная таблица, состоящая из строк и столбцов на пересечении которых находятся её элементы). Количество строк и столбцов матрицы задают ее размер. Общий вид матрицы размером n x n ( n — количество строк, количество столбцов), выглядит следующим образом:

Изображение

Каждый элемент матрицы имеет свой индекс, где первая цифра обозначает номер строки на которой находится элемент, а вторая — номер столбца.

В задачах по программированию очень часто встречается необходимость заполнить массив данными и вывести их потом на экран. В первоначальной задаче необходимо заполнить массив следующим образом: начиная с правого верхнего угла, двигаясь по спирали присвоить каждому элементу массива значение, которое ввел пользователь.
Схематически это выглядит так:

Изображение

То есть, в каждом "квадрате" матрицы нам нужно проходить 4 шага, заполняя 4 стороны "квадрата".

Создадим класс, в котором реализуем 2 метода: само заполнение матрицы и ее вывод. Объявим переменную, в которой будет содержаться количество строк(столбцов) матрицы.

private final int N;

Займемся написанием кода метода заполнения матрицы. Он должен возвращать массив String. Объявление метода будет выглядеть следующим образом:

public String[][] fillMatrix()

По мере прохождения сторон "квадрата" мы проходим 4 итерации, в ходе которых проходим N элементов нашего массива. Это повторяется, пока не закончатся "квадраты", то есть N/2 (при этом, если N нечетное, то округление должно производиться в большую сторону) раз. Следовательно, можно выделить 3 цикла:

while ( Math.round((double)Col/2) > 0) < for (int i = 0; i < 4; i++) <>for (int j = 0; j < Col; j++) <>Col—; >

При условии того, что:

int Col = N;

Так как N была объявлена как финальная переменная и не может быть изменена.

Теперь, в зависимости от номера итерации (стороны "квадрата"), нужно определять индексы элемента массива для записи. Введем дополнительную переменную типа int, которая будет увеличиваться с каждым пройденным "квадратом". Создадим объект класса Scanner, подключив нужную библиотеку.

Сейчас код выглядит так:

import java.util.Scanner; public class FillMatrix < private final int N; public FillMatrix(int N) < this.N = N; >// Конструктор класса, который потребуется вызвать при создании объекта класса, указав при этом размер массива. public String[][] fillMatrix() < Scanner ReadEl = new Scanner(System.in); String[][] Mass = new String[N][N]; int Col = N; int Max = 0; while ( Math.round((double)Col/2) >0) < for (int i = 0; i < 4; i++) < for (int j = 0; j < Col; j++) < if (i == 0 && j < Col - Max) < Mass[i + Max][j + Max] = ReadEl.next(); >if(j != 0) < if (i == 2 && j < Col - Max ) < Mass[Col - 1][Col - (j + 1)] = ReadEl.next(); >if (i == 1 && j < Col - Max ) < Mass[j + Max][Col - 1] = ReadEl.next(); >if (i == 3 && j < Col - (Max + 1)) < Mass[Col - (j + 1)][Max] = ReadEl.next(); >> > > Col--; Max++; > return Mass; >

Все индексы посчитаны, осталось написать метод для вывода матрицы. Для упрощения воспользуемся стандартным методом для вывода одномерного массива. Для этого подключим требуемую библиотеку:

import java.util.Arrays;

Код данного метода будет выглядеть следующим образом:

public void printMatrix(String[][] mass) < for (int i = 0; i < mass.length; i++) < System.out.println(Arrays.toString(mass[i])); >>

Он принимает массив String и выводит в консоль по каждой строке все элементы массива, ничего не возвращая.
Теперь осталось только использовать данный класс и испытать его методы. Для этого создадим главный класс, в котором объявим переменную типа int для хранения размера массива,который задаст пользователь и считаем ее.

Scanner ReadEl = new Scanner(System.in); System.out.print("n="); int n = ReadEl.nextInt();

Создадим объект класса FillMatrix и вызовем созданные методы. Полностью код главного класса выглядит так:

import java.util.Scanner; public class SpiralMatrix < public static void main(String[] args) < Scanner ReadEl = new Scanner(System.in); System.out.print("n="); int n = ReadEl.nextInt(); FillMatrix FXF = new FillMatrix(n); FXF.printMatrix(FXF.fillMatrix()); >>

Результат выполнения программы можно увидеть ниже:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *