Задача
Заполнить массив размера $n × n$ единичками по спирали (см. пример).
Входные данные
Одно нечетное натуральное число $n$, не превышающее $50$.
Выходные данные
Вывести построенную спираль. Центральная клетка должна содержать $0$.
Тесты
Входные данные | Выходные данные |
[latex]7[/latex] | [latex]1111111 \\ 0000001 \\ 1111101 \\ 1000101 \\ 1011101 \\ 1000001 \\ 1111111[/latex] |
[latex]1[/latex] | [latex]0[/latex] |
[latex]3[/latex] | [latex]111 \\ 001 \\ 111[/latex] |
[latex]5[/latex] | [latex]11111 \\ 00001 \\ 11001 \\ 10001 \\ 11111[/latex] |
Код программы
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 |
import java.util.Scanner; public class Main { public static void main (String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int [][] s = new int[50][50]; for(int i=0; i<n; i++) { s[0][i]=1; s[n-1][i]=1; s[i][n-1]=1; } int h=n-2, d=n-2; int pointx=n-1, pointy=0; while(true) { for(int i=0; i<h; i++) { s[pointx-i][pointy]=1; } pointx-=h-1; h-=2; if(h<=0) break; for(int i=0; i<d; i++) { s[pointx][pointy+i]=1; } pointy+=d-1; d-=2; if(d<=0) break; for(int i=0; i<h; i++) { s[pointx+i][pointy]=1; } pointx+=h-1; h-=2; if(h<=0) break; for(int i=0; i<d; i++) { s[pointx][pointy-i]=1; } pointy-=d-1; d-=2; if(d<=0) break; } s[n/2][n/2]=0; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { System.out.print(s[i][j]); } System.out.println(); } } } |
Решение задачи
Для начала мы верхнюю, нижнюю и правую грани зразу заполним единицами. Далее идем поочередно в четырех направления (вверх, вправо, вниз, влево). Мы имеем два параметра: ширину и высоту заполняемого единицами отрезка (ширине соответствуют движения вправо и влево, высоте — вверх и вниз). На каждом шаге уменьшаем соответствующий заполняемый отрезок (ширину или высоту) на $2$ и проверяем, чтобы он был больше $0$, иначе заканчиваем. На протяжении всего решения храним еще два параметра: координаты точки, откуда начнем следующий шаг.
P.s. На сайте www.e-olymp.com это решение не проходит полностью из-за неправильности $5$-го теста. У них в $5$-ом тесте центральный элемент $1$, что противоречит условию.