Как заполнить матрицу по спирали с
Перейти к содержимому

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

  • автор:

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

Сообщений: 27

Нужно заполнить матрицу размера n натуральными числами (1,2,3. ). По периметру заполнил, а как дальше понять не могу.

#include #include #include class spiral < private: int i,j; //Счетчики элементов массива int n; //Размер массива int **a; //Массив указателей public: spiral (int m); //Конструктор ~spiral (); //Деструктор void obr (); //Функция обработки массива void output (); //Функция вывода элементов массива на экран >; spiral :: spiral (int m) < n=m; //Присваивание локальной переменной размер массива a=new int *[n]; //Выделение памяти в ОЗУ для строк массива for (i=0;ispiral :: ~spiral () < for (i=0;ivoid spiral :: obr () < int k=1; //Счетчик натуральных чисел for (j=0;jvoid spiral :: output () < cout> int main () < clrscr(); int m; cout>m; spiral mas (m); //Создание объекта класса spiral mas.obr (); mas.output (); getch(); return 0; >

Последний раз редактировалось Stilet; 03.05.2010 в 11:57 .

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

Заполнение матрицы по спирали
Недавно преподаватель дал дополнительное задание, которое называется спираль и попросил его.

Заполнение матрицы по спирали по часовой стрелке
Объясните как решить такую задачу. Сказали можно в два цикла обойтись. Я не понимаю как. Массив.

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

Заполнение матрицы от центра по спирали (по часовой стрелке)
написать программу, которая заполняет массив от цента по спирали(по часовой стрелке). пример: .

3802 / 2354 / 413
Регистрация: 09.09.2017
Сообщений: 10,206

1 2 3 4 5 6
printf("\033[31m1 2 3 4 5\n"); printf("\033[32m16 \033[37m17 18 19 \033[33m6\n"); printf("\033[32m15 \033[37m24 25 \033[34m20 \033[33m7\n"); printf("\033[32m14 \033[35m23 22 \033[34m21 \033[33m8\n"); printf("\033[36m13 12 11 10 \033[33m9\n"); printf("\033[37;40m");

Правда, настолько ярко желтого цвета я не нашел, заменил на голубой. Ну и черный на черной консоли был бы не виден, я его заменил на белый. В остальном похоже.
Или вам надо всего лишь заполнить массив змейкой, без раскрашивания? Так эта задача тут едва ли не на каждой странице форума встречается

Регистрация: 04.10.2018
Сообщений: 3

да, надо заполнить змейкой, но чтобы я смогла изменить размерность (например 7 на 7) и он тоже работал

Добавлено через 35 секунд
цвета не важны, это я для простоты понимания сделала

698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255

На RosettaCode есть решение данной задачи (см. Spiral matrix). Одно из предложенных решений — с помощью рекурсии:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include int spiral(int w, int h, int x, int y) { return y ? w + spiral(h - 1, w, y - 1, w - x - 1) : x; } int main(int argc, char **argv) { int w = atoi(argv[1]), h = atoi(argv[2]), i, j; for (i = 0; i  h; i++) { for (j = 0; j  w; j++) printf("%4d", spiral(w, h, j, i)); putchar('\n'); } return 0; }

Регистрация: 04.10.2018
Сообщений: 3

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#include #include #define valid(i, j) 0 int main(int c, char **v) { int i, j, m = 0, n = 0; /* default size: 5 */ if (c >= 2) m = atoi(v[1]); if (c >= 3) n = atoi(v[2]); if (m  0) m = 5; if (n  0) n = m; int **s = calloc(1, sizeof(int *) * m + sizeof(int) * m * n); s[0] = (int*)(s + m); for (i = 1; i  m; i++) s[i] = s[i - 1] + n; int dx = 1, dy = 0, val = 0, t; for (i = j = 0; valid(i, j); i += dy, j += dx ) { for (; valid(i, j); j += dx, i += dy) s[i][j] = ++val; j -= dx; i -= dy; t = dy; dy = dx; dx = -t; } for (t = 2; val /= 10; t++); for(i = 0; i  m; i++) for(j = 0; j  n || !putchar('\n'); j++) printf("%*d", t, s[i][j]); return 0; }

Добавлено через 2 минуты
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

ЦитатаСообщение от Eanmos Посмотреть сообщение

Заполнение матрицы змейкой (по спирали)

Люди!Помогите!Пожалуста!У меня зачёт скоро!Не могу сделать прогу!В чём суть?!Пользователь должен ввести размерность матрици!Матрица квадратная!А программа должна заполнить её числами по порядку 1 2 3 4 5 . как змейка, по часовой стрелке
Вот пример, чтоб было ясно
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
Люди!Помогите кто может!Выгонят же к чертям. Деньги препад не берёт!

Лучшие ответы ( 3 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Заполнение матрицы змейкой (по спирали)
Написать программу, которая двумерный массив целых чисел размером 5х5 заполняет следующим образом.

Заполнение матрицы змейкой
Здравствуйте, нужно заполнить матрицу змейкой(картинка змейки вложена). Матрица NxN (1<=N<=10).

Заполнение матрицы змейкой
Дано натуральное N (1<=N<=10). Заполнить матрицу размера N*N целыми числами 0, 1, 2, 3, …, N^2–1 .

Заполнение матрицы змейкой
Дано натуральное N (1<=N<=10). Заполнить матрицу размера N*N целыми числами 0, 1, 2, 3, …, N^2–1 в.

Администратор
83279 / 51857 / 244
Регистрация: 10.04.2006
Сообщений: 13,411

Лучший ответ

Сообщение было отмечено как решение

Решение

Заполнение квадратной матрицы по спирали натуральными числами и вывода результата на экран:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int const n=11; int A[n][n]; int i=1,j,k,p=n/2; for(k=1;kp;k++)/*Цикл по номеру витка*/ { for (j=k-1;jn-k+1;j++) A[k-1][j]=i++;/*Определение значений верхнего гор столбца*/ for (j=k;jn-k+1;j++) A[j][n-k]=i++;/* --//-- По правому вертикальному столбцу*/ for (j=n-k-1;j>=k-1;--j) A[n-k][j]=i++;/* --//-- по нижнему горизонтальному столбцу*/ for (j=n-k-1;j>=k;j--) A[j][k-1]=i++;/* --//-- по левому вертикальному столбцу*/ } if (n%2==1) A[p][p]=n*n; for(i=0;in;i++) for(j=0;jn;j++) { printf(" %4d ",A[i][j]); if(j==n-1) printf("\n"); } }

Администратор
83279 / 51857 / 244
Регистрация: 10.04.2006
Сообщений: 13,411

Лучший ответ

Сообщение было отмечено как решение

Решение

Еще пример заполнения матрицы по спирали:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
// Построить матрицу А(15x15)таким образом: // А(7,7)=1, затем, по спирали против // часовой стрелки, увеличивая значение // очередного элемента на единицу и // выделяя все простые числа красным цветом // заполнить матрицу #include #include void main(void) { clrscr(); int mas[15][15]; int n=1,x=6,y=6,k=1; int i,j; while(1){ mas[x][y]=k++; switch(n){ case 1: x++;break; case 2: y--;break; case 3: x--;break; case 4: y++;break; } if(x==15) break; if(x==y && x6) n=4; else if(x+y==12 && x6) n=1; else if(x+y==12 && x>6) n=3; else if(x==y+1 && x>6) n=2; } for(i=0;i15;i++) { for(j=0;j15;j++) { textcolor(12); if(mas[j][i]>2) for(k=2;kmas[j][i];k++) if(mas[j][i]%k==0) textcolor(15); cprintf("%3d ",mas[j][i]); } printf("\n"); } getch(); }

Регистрация: 21.12.2007
Сообщений: 5

вопрос по первому коду: как сделать чтобы выводилось красиво в столбик?
1 2 3
8 9 4
7 6 5
а не как попало

Регистрация: 25.12.2007
Сообщений: 7
часть кода для вывода в виде матрицы:

1 2 3 4 5 6 7
for(i=0;in;i++) { printf("\n"); for(j=0;jn;j++) printf("%4d ",A[i][j]); }

подскажите плз. задание похожее.
надо сделать матрицу (9х9) и заполнить ПО часовой стрелке по спирали , начиная с середины

если нездам эту прогу, до екзамена недопустят ((
заранее спасибо

Регистрация: 13.11.2009
Сообщений: 22
а что значит вот эта запись?:
A[k-1][j]=i++
Регистрация: 14.12.2009
Сообщений: 8

mik-a-el, спасибо за первый пример!
А возможно ли по его аналогии сделать сортировку матрицы A(n,m), если n неравно m?

Регистрация: 14.12.2009
Сообщений: 8

Лучший ответ

Сообщение было отмечено как решение

Решение

Хм, уже разобрался сам.. Проблема решилась путем упорного скрещивания двух различных кодов
Кому интересно, привожу код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include #include // расширение функционала iostream, // в частности setw() using namespace std; int main() { int const n=5; int const m=4; int Arr[n][m]; int i=0, j, k = 0, p=1; while (i  n*m) /*Цикл по номеру витка*/ { k++; for (j=k-1;jm-k+1;j++) { Arr[k-1][j]=p++; i++; } /*Определение значений верхнего гор столбца*/ for (j=k;jn-k+1;j++) { Arr[j][m-k]=p++; i++; } /* --//-- По правому вертикальному столбцу*/ for (j=m-k-1;j>=k-1;j--) { Arr[n-k][j]=p++; i++; } /* --//-- по нижнему горизонтальному столбцу*/ for (j=n-k-1;j>=k;j--) { Arr[j][k-1]=p++; i++; } /* --//-- по левому вертикальному столбцу*/ } for (int q=0; qn; q++) { for (int w=0; wm; w++) { cout  (4)  [q][w]; }; cout  ; } return(0); }

105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406

А не могли бы решить эту же задачу следующим способом:
найти соотношение между значением элемента K и его индексами [i,j], то есть функцию вида F(K,N) = , которая по номеру K элемента в змейке возвращает его координаты в матрице ; другими словами a[i,j]=K. При этом данная функция не долж-на использовать циклы – только элементарные арифметические действия и проверку различ-ных условий! Построив такую функцию можно простым перебором значений K от 0 до N2–1 находить индексы для каждого K с помощью функции F и записывать в матрицу К по найден-ным индексам.

Регистрация: 06.07.2010
Сообщений: 3

У меня почти такое-же, ток:
Выводится N строк по N чисел, разделённых пробелами. Не допускается начинать спираль в ином, кроме верхнего левого, углу, закручивать спираль против часовой стрелки или изнутри наружу.немогли бы помочь? (если можно, то на Си)

The_Marvel

У меня задача, похожая на разобранную, только спираль начинается с центрального элемента матрицы (матрица — квадрат нечётного размера). Заполнение так же осуществляется по часовой стрелке. Например:
6 7 8
5 0 1
4 3 2
Помогите, если можно. Не могу вывести закономерность

Регистрация: 20.10.2010
Сообщений: 30

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#include #include #include #include void zapovn(int **, int); int main() { int n,i,j; int **arr; clrscr(); printf("\nn="); scanf("%d",&n); arr=(int**)calloc(n,sizeof(int*)); for(i=0;in;i++) arr[i]=(int*)calloc(n,sizeof(int)); zapovn(arr,n); for(i=0;in;i++){ for(j=0;jn;j++) printf("%2d ",arr[i][j]); printf("\n");} for(i=0;in;i++) free(arr[i]); free(arr); getch(); return 0; } void zapovn(int **A, int m){ int i,j,k,b,c; i=m/2; j=i; printf("\nvvedit masiv\n"); scanf("%d",&A[i][j]); for(k=0,j=j-1;k2;k++,i++) scanf("%d",&A[i][j]); for(k=0,j=j+1,i=i-1;k2;k++,j++) scanf("%d",&A[i][j]); for(k=0,j=j-1,i=i-1;k2;k++,i--) scanf("%d",&A[i][j]); for(b=3,c=4;bm;b+=2,c+=2) { if(b==m){ b=m-1; for(k=0,j=j-1,i=i+1;kb;k++,j--) scanf("%d",&A[i][j]); break; } else for(k=0,j=j-1,i=i+1;kb;k++,j--) scanf("%d",&A[i][j]); for(k=0,j=j+1,i=i+1;kb;k++,i++) scanf("%d",&A[i][j]); for(k=0,j=j+1,i=i-1;kc;k++,j++) scanf("%d",&A[i][j]); for(k=0,j=j-1,i=i-1;kc;k++,i--) scanf("%d",&A[i][j]); } }

как-то так. правда на с.
Регистрация: 19.01.2011
Сообщений: 4

Сколько не сидел, так и не разобрался в коде программы.
Мне по заданию нужна матрица 9х9
5 6 7
4 1 8
3 2 9
как это сделать?
(на языке С не усложняя программу попросами к пользователю, типа: по часовой или против, размерность массива, с какой цифры начинать, всего это НЕ нужно)
ах да, и матрицу нужно заполнять линейной последовательностью чисел от 1 до 81, т.е. у пользователя вообще ничего не спрашивать.

ЦитатаСообщение от mik-a-el Посмотреть сообщение

Еще пример заполнения матрицы по спирали:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
// Построить матрицу А(15x15)таким образом: // А(7,7)=1, затем, по спирали против // часовой стрелки, увеличивая значение // очередного элемента на единицу и // выделяя все простые числа красным цветом // заполнить матрицу #include #include void main(void) { clrscr(); int mas[15][15]; int n=1,x=6,y=6,k=1; int i,j; while(1){ mas[x][y]=k++; switch(n){ case 1: x++;break; case 2: y--;break; case 3: x--;break; case 4: y++;break; } if(x==15) break; if(x==y && x6) n=4; else if(x+y==12 && x6) n=1; else if(x+y==12 && x>6) n=3; else if(x==y+1 && x>6) n=2; } for(i=0;i15;i++) { for(j=0;j15;j++) { textcolor(12); if(mas[j][i]>2) for(k=2;kmas[j][i];k++) if(mas[j][i]%k==0) textcolor(15); cprintf("%3d ",mas[j][i]); } printf("\n"); } getch(); }

а как сократить число элемента массива по 49-й, ведь их там 289?
Регистрация: 24.10.2012
Сообщений: 3

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

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

ЦитатаСообщение от MrakSPb Посмотреть сообщение

Хм, уже разобрался сам.. Проблема решилась путем упорного скрещивания двух различных кодов
Кому интересно, привожу код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include #include // расширение функционала iostream, // в частности setw() using namespace std; int main() { int const n=5; int const m=4; int Arr[n][m]; int i=0, j, k = 0, p=1; while (i  n*m) /*Цикл по номеру витка*/ { k++; for (j=k-1;jm-k+1;j++) { Arr[k-1][j]=p++; i++; } /*Определение значений верхнего гор столбца*/ for (j=k;jn-k+1;j++) { Arr[j][m-k]=p++; i++; } /* --//-- По правому вертикальному столбцу*/ for (j=m-k-1;j>=k-1;j--) { Arr[n-k][j]=p++; i++; } /* --//-- по нижнему горизонтальному столбцу*/ for (j=n-k-1;j>=k;j--) { Arr[j][k-1]=p++; i++; } /* --//-- по левому вертикальному столбцу*/ } for (int q=0; qn; q++) { for (int w=0; wm; w++) { cout  (4)  [q][w]; }; cout  ; } return(0); }

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

Задача:
Заполнить квадратную матрицу произвольного размера элементами, которые вводит пользователь. Заполнение должно производится по спирали, слева — направо — сверху — вниз.
Для реализации данной задачи использовать язык программирования 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 не будет опубликован. Обязательные поля помечены *