Возьмём массив, в котором содержится пять строк и пять столбцов, заполним его по спирали числами, начиная с 1, и выведем на экран. В первом примере массив заполняется по часовой стрелке от периферии к центру.
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
public class JavaApplication1 { public static void main(String[] args) { //Заполним массив, количество строк мы обозначим m, а столбцов - n. int m = 5; int n = 5; //С помощью переменной s задаются числа внутри массива начиная с 1. int s = 1; //Объявляем и инициализируем массив. int[][] array = new int[m][n]; //Заполняем периметр массива по часовой стрелке. for (int y = 0; y < n; y++) { array[0][y] = s; s++; } for (int x = 1; x < m; x++) { array[x][n - 1] = s; s++; } for (int y = n - 2; y >= 0; y--) { array[m - 1][y] = s; s++; } for (int x = m - 2; x > 0; x--) { array[x][0] = s; s++; } //Периметр заполнен. Продолжаем заполнять массив и задаём //координаты ячейки, которую необходимо заполнить следующей. int c = 1; int d = 1; while (s < m * n) { //В Java инициализированный интовый массив заполняется нулями. //Периметр мы заполнили числами, отличными от нулей. //Следующие циклы поочерёдно работают, заполняя ячейки. //Вложенный цикл останавливается, если следующая ячейка имеет //значение, отличное от ноля. Ячейка, на которой остановился //цикл, не заполняется. //Движемся вправо. while (array[c][d + 1] == 0) { array[c][d] = s; s++; d++; } //Движемся вниз. while (array[c + 1][d] == 0) { array[c][d] = s; s++; c++; } //Движемся влево. while (array[c][d - 1] == 0) { array[c][d] = s; s++; d--; } //Движемся вверх. while (array[c - 1][d] == 0) { array[c][d] = s; s++; c--; } } //При данном решении в центре всегда остаётся незаполненная ячейка. //Убираем её при помощи следующего цикла. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] == 0) { array[x][y] = s; } } } //Выводим массив в консоль. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] < 10) { //Два пробела, чтобы в консоли столбцы были ровные. System.out.print(array[x][y] + ", "); } else { System.out.print(array[x][y] + ", "); } } System.out.println(""); } } } |
В консоли видим:
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, |
Если в задании требуется вывести в консоль массив, заполненный от центра к периферии против часовой стрелки, возьмите приведённый выше код. Заполнять массив мы будем также (от периферии к центру), но числа по мере заполнения, будут не возрастать, а убывать.
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
public class JavaApplication1 { public static void main(String[] args) { //Заполним массив, количество строк мы обозначим m, а столбцов - n. int m = 5; int n = 5; //С помощью переменной s задаются числа внутри массива, //начиная с 25 в данном случае. int s = m*n; //Объявляем и инициализируем массив. int[][] array = new int[m][n]; //Заполняем периметр массива по часовой стрелке. //Не забудьте поменять инкремент на декремент у переменной s. for (int y = 0; y < n; y++) { array[0][y] = s; s--; } for (int x = 1; x < m; x++) { array[x][n - 1] = s; s--; } for (int y = n - 2; y >= 0; y--) { array[m - 1][y] = s; s--; } for (int x = m - 2; x > 0; x--) { array[x][0] = s; s--; } //Периметр заполнен. Продолжаем заполнять массив и задаём //координаты ячейки, которую необходимо заполнить следующей. int c = 1; int d = 1; while (s > 1) { //В Java инициализированный интовый массив заполняется нулями. //Периметр мы заполнили числами, отличными от нулей. //Следующие циклы поочерёдно работают, заполняя ячейки. //Вложенный цикл останавливается, если следующая ячейка имеет //значение, отличное от ноля. Ячейка, на которой остановился //цикл, не заполняется. Из-за этого условие для выхода из внешнего //цикла - (s>1). Если Вы поставите 0, получится вечный цикл. //Движемся вправо. while (array[c][d + 1] == 0) { array[c][d] = s; s--; d++; } //Движемся вниз. while (array[c + 1][d] == 0) { array[c][d] = s; s--; c++; } //Движемся влево. while (array[c][d - 1] == 0) { array[c][d] = s; s--; d--; } //Движемся вверх. while (array[c - 1][d] == 0) { array[c][d] = s; s--; c--; } } //При данном решении в центре всегда остаётся незаполненная ячейка. //Убираем её при помощи следующего цикла. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] == 0) { array[x][y] = s; } } } //Выводим массив в консоль. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] < 10) { //Два пробела, чтобы в консоли столбцы были ровные. System.out.print(array[x][y] + ", "); } else { System.out.print(array[x][y] + ", "); } } System.out.println(""); } } } |
В консоли будет:
25, | 24, | 23, | 22, | 21, |
10, | 9, | 8, | 7, | 20, |
11, | 2, | 1, | 6, | 19, |
12, | 3, | 4, | 5, | 18, |
13, | 14, | 15, | 16, | 17, |
Массив был, фактически, заполнен от периферии к центру, но при выводе в консоль создаётся впечатление, что заполнялся он наоборот, от центра к периферии. Если Ваш массив квадратный (одна сторона равна другой), и в строке содержится нечётное количество элементов, тогда единица располагается в центре. При моих вариантах решения задачи сюрпризы начинаются, если массив имеет вытянутую прямоугольную форму (например 5 на 11).
55, | 28, | 29, | 30, | 31, | 32, | 33, | 34, | 35, | 36, | 37, |
54, | 27, | 8, | 9, | 10, | 11, | 12, | 13, | 14, | 15, | 38, |
53, | 26, | 7, | 6, | 5, | 4, | 3, | 2, | 1, | 16, | 39, |
52, | 25, | 24, | 23, | 22, | 21, | 20, | 19, | 18, | 17, | 40, |
51, | 50, | 49, | 48, | 47, | 46, | 45, | 44, | 43, | 42, | 41, |
Как видим, единица расположена далеко от центрального элемента массива array [2][5]. За сим, если Вам на собеседовании необходимо заполнить массив от центра к периферии, либо постарайтесь, чтобы он имел вид 5 на 5 или 7 на 7 и т. п., либо поищите другой вариант решения задачи.
Выводим в консоль массив, заполненный от центра к периферии по часовой стрелке.
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
public class JavaApplication1 { public static void main(String[] args) { //Заполним массив, количество строк мы обозначим m, а столбцов - n. int m = 5; int n = 5; //С помощью переменной s задаются числа внутри массива, //начиная с 25 в данном случае. int s = m * n; //Объявляем и инициализируем массив. int[][] array = new int[m][n]; //Заполняем периметр массива против часовой стрелке. //Не забудьте поменять инкремент на декремент у переменной s. for (int x = 0; x < m; x++) { array[x][0] = s; s--; } for (int y = 1; y < n; y++) { array[m - 1][y] = s; s--; } for (int x = m - 2; x >= 0; x--) { array[x][n - 1] = s; s--; } for (int y = n - 2; y >= 1; y--) { array[0][y] = s; s--; } //Периметр заполнен. Продолжаем заполнять массив и задаём //координаты ячейки, которую необходимо заполнить следующей. int c = 1; int d = 1; while (s > 1) { //В Java инициализированный интовый массив заполняется нулями. //Периметр мы заполнили числами, отличными от нулей. //Следующие циклы поочерёдно работают, заполняя ячейки. //Вложенный цикл останавливается, если следующая ячейка имеет //значение, отличное от ноля. Ячейка, на которой остановился //цикл, не заполняется. Из-за этого условие для выхода из внешнего //цикла - (s>1). Если Вы поставите 0, получится вечный цикл. //Движемся вниз. while (array[c + 1][d] == 0) { array[c][d] = s; s--; c++; } //Движемся вправо. while (array[c][d + 1] == 0) { array[c][d] = s; s--; d++; } //Движемся вверх. while (array[c - 1][d] == 0) { array[c][d] = s; s--; c--; } //Движемся влево. while (array[c][d - 1] == 0) { array[c][d] = s; s--; d--; } } //При данном решении в центре всегда остаётся незаполненная ячейка. //Убираем её при помощи следующего цикла. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] == 0) { array[x][y] = s; } } } //Выводим массив в консоль. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] < 10) { //Два пробела, чтобы в консоли столбцы были ровные. System.out.print(array[x][y] + ", "); } else { System.out.print(array[x][y] + ", "); } } System.out.println(""); } } } |
В консоли:
25, | 10, | 11, | 12, | 13, |
24, | 9, | 2, | 3, | 14, |
23, | 8, | 1, | 4, | 15, |
22, | 7, | 6, | 5, | 16, |
21, | 20, | 19, | 18, | 17, |
И последний вариант, массив, заполненный от периферии к центру против часовой стрелки.
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
public class JavaApplication1 { public static void main(String[] args) { //Заполним массив, количество строк мы обозначим m, а столбцов - n. int m = 5; int n = 5; //С помощью переменной s задаются числа внутри массива, //начиная с 1 в данном случае. int s = 1; //Объявляем и инициализируем массив. int[][] array = new int[m][n]; //Заполняем периметр массива против часовой стрелке. for (int x = 0; x < m; x++) { array[x][0] = s; s++; } for (int y = 1; y < n; y++) { array[m - 1][y] = s; s++; } for (int x = m - 2; x >= 0; x--) { array[x][n - 1] = s; s++; } for (int y = n - 2; y >= 1; y--) { array[0][y] = s; s++; } //Периметр заполнен. Продолжаем заполнять массив и задаём //координаты ячейки, которую необходимо заполнить следующей. int c = 1; int d = 1; while (s < m * n) { //В Java инициализированный интовый массив заполняется нулями. //Периметр мы заполнили числами, отличными от нулей. //Следующие циклы поочерёдно работают, заполняя ячейки. //Вложенный цикл останавливается, если следующая ячейка имеет //значение, отличное от ноля. Ячейка, на которой остановился //цикл, не заполняется. //Движемся вниз. while (array[c + 1][d] == 0) { array[c][d] = s; s++; c++; } //Движемся вправо. while (array[c][d + 1] == 0) { array[c][d] = s; s++; d++; } //Движемся вверх. while (array[c - 1][d] == 0) { array[c][d] = s; s++; c--; } //Движемся влево. while (array[c][d - 1] == 0) { array[c][d] = s; s++; d--; } } //При данном решении в центре всегда остаётся незаполненная ячейка. //Убираем её при помощи следующего цикла. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] == 0) { array[x][y] = s; } } } //Выводим массив в консоль. for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { if (array[x][y] < 10) { //Два пробела, чтобы в консоли столбцы были ровные. System.out.print(array[x][y] + ", "); } else { System.out.print(array[x][y] + ", "); } } System.out.println(""); } } } |
В консоли:
1, | 16, | 15, | 14, | 13, |
2, | 17, | 24, | 23, | 12, |
3, | 18, | 25, | 22, | 11, |
4, | 19, | 20, | 21, | 10, |
5, | 6, | 7, | 8, | 9, |
P. S. Если Вы пытаетесь приспособить этот вариант решения задачи к другим языкам, в которых массивы заполняются мусорными числами (например, С++), то для начала заполните весь массив каким-то числом, которого в массиве точно не будет, ( -1, как вариант).