Заполнить матрицу по спирали

160
27 февраля 2019, 06:10

Не смог найти библиотеку, которая позволяет заполнить матрицу по спирали, например так:

1 2 3    
8 9 4    
7 6 5    

или наоборот - из центра наружу.

Кто знает, как это сделать самому?

Answer 1

Используйте метод getSpiralMatrix() реализованный ниже:

package com.example;
import java.util.stream.IntStream;
public class SpiralMatrix {
    public int[][] getSpiralMatrix(int n, boolean reverse) {
        int [][] matrix = new int[n][];
        IntStream.range(0, n).forEach(i -> matrix[i] = new int[n]);
        int x = 0;
        int y = 0;
        int z = n;
        for (int i = 0, j = n * n; i < j;) {
            matrix[x][y] = reverse ? j - i++ : ++i;
            if (x < z + (n - z) / 2 - 1 && y == (n - z) / 2) {
                x++;
            } else if (x == z + (n - z) / 2 - 1 && y < z + (n - z) / 2 - 1) {
                y++;
            } else if (x > (n - z) / 2 && y == z + (n - z) / 2 - 1) {
                x--;
            } else if (x == (n - z) / 2 && y > (n - z) / 2 + 1) {
                y--;
            } else {
                x++;
                z -= 2;
            }
        }
        return matrix;
    }
    public static void main(String[] args) {
        SpiralMatrix sp = new SpiralMatrix();
        int n = 9;
        int[][] matrix = sp.getSpiralMatrix(n, true);
        printMatrix(matrix);
        System.out.println("===========================");
        matrix = sp.getSpiralMatrix(n, false);
        printMatrix(matrix);
    }
    private static void printMatrix(int[][] matrix) {
        IntStream.range(0, matrix.length).forEach(i -> {
            IntStream.range(0, matrix.length).forEach(j -> System.out.printf("%02d ", matrix[j][i]));
            System.out.println();
        });
    }
}

Этот демонстрационный код напечатает:

81 80 79 78 77 76 75 74 73 
50 49 48 47 46 45 44 43 72 
51 26 25 24 23 22 21 42 71 
52 27 10 09 08 07 20 41 70 
53 28 11 02 01 06 19 40 69 
54 29 12 03 04 05 18 39 68 
55 30 13 14 15 16 17 38 67 
56 31 32 33 34 35 36 37 66 
57 58 59 60 61 62 63 64 65 
===========================
01 02 03 04 05 06 07 08 09 
32 33 34 35 36 37 38 39 10 
31 56 57 58 59 60 61 40 11 
30 55 72 73 74 75 62 41 12 
29 54 71 80 81 76 63 42 13 
28 53 70 79 78 77 64 43 14 
27 52 69 68 67 66 65 44 15 
26 51 50 49 48 47 46 45 16 
25 24 23 22 21 20 19 18 17 
READ ALSO
Обработка нажатия кнопки ImageButton

Обработка нажатия кнопки ImageButton

Пишу приложение под androidСоздал отдельное activity для словаря(приложение будет переводить слова из существующей базы и при подключении интернета...

164
Система регистрации

Система регистрации

Всем приветВ общем, мне нужно сделать регистрацию в приложении

164
Почему GPS не работает на андроид?

Почему GPS не работает на андроид?

Нужен был GPS в приложении под андроидЕсть простой код(снизу) , он пару дней поработал а сейчас уже не работает

182
Как избавиться от потери строк Buffered Reader/Writer

Как избавиться от потери строк Buffered Reader/Writer

Суть в следующем: Читаю файл построчно с помощью BufferedReader

169