مساله:
وظیفه شما این است که یک مارپیچ NxN با اندازه داده شده ایجاد کنید.
به عنوان مثال ، مارپیچ با اندازه 5 باید به این شکل باشد:
00000 ....0 000.0 0...0 00000
و با سایز 10:
0000000000 .........0 00000000.0 0......0.0 0.0000.0.0 0.0..0.0.0 0.0....0.0 0.000000.0 0........0 0000000000
مقدار برگشتی آرایه ای از آرایه های 0 و 1 باید باشد، برای مثال برای اندازه 5 داده شده نتیجه باید:
[[1,1,1,1,1],[0,0,0,0,1],[1,1,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
به دلیل قاب های مارپیچی کوچک ، اندازه آن حداقل 5 خواهد بود.
قانون کلی این است که مار ساخته شده با “1” نمی تواند خود را لمس کند.
public class Spiralizor { public static int[][] spiralize(int size) { int spiral[][] = new int[size][size]; for (int n=0; n<(size+1)/2; n+=2) { for (int i=n-1; i<size-n; i++) if (i>=0) spiral[n][i] = 1; for (int i=n+1; i<size-n; i++) spiral[i][size-1-n] = 1; for (int i=size-1-1-n; i>=n; i--) if (n<(size+1)/2-1) spiral[size-1-n][i] = 1; for (int i=size-1-1-n; i>=n+2; i--) spiral[i][n] = 1; } return spiral; } }
public class Spiralizor { public static int[][] spiralize(int n) { int [][] a = new int[n][n]; int n4 = n%4==0? 1: 0; for (int y = 0, c = 1; y <= n/2; y++) { for (int x = y; x < n -y; x++) a[y][x] = a[x][n-1 -y] = a[n-1 -y][n-1 -x] = a[n-1 -x][y] = c; c = 1-c; if (y+n4 < n/2) a[y+1][y] = c; } return a; } }
public class Spiralizor { public static int[][] spiralize(int size) { if(size <= 0) return null; int[][] spiral = new int[size][size]; int minCol = 0; int maxCol = size-1; int minRow = 0; int maxRow = size-1; for (int i = 0; i < spiral.length; i++) { for (int j = 0; j < spiral.length; j++) spiral[i][j] = 0; } while (minRow <= maxRow){ for (int i = minCol; i <= maxCol; i++) spiral[minRow][i] = 1; for (int i = minRow; i <= maxRow; i++) spiral[i][maxCol] = 1; if(minCol != 0) minCol+=1; if(maxRow-1 == minRow) break; for (int i = maxCol-1; i >= minCol; i--) spiral[maxRow][i] = 1; for (int i = maxRow-1; i >= minRow+2; i--) spiral[i][minCol] = 1; minCol+=1; minRow+=2; maxCol-=2; maxRow-=2; } return spiral; } }
public class Spiralizor { public static int[][] spiralize(int n) { if(n<=4){ int[][] one = {{1}}; int[][] two = {{1,1},{0,1}}; int[][] thr = {{1,1,1},{0,0,1},{1,1,1}}; int[][] fou = {{1,1,1,1},{0,0,0,1},{1,0,0,1},{1,1,1,1}}; if(n==1) return one; else if(n==2) return two; else if(n==3) return thr; else return fou; } int[][] map = new int[n][n]; for(int i = 0; i < n; i++)map[0][i]=1; for(int i = 0; i < n; i++)map[i][n-1]=1; for(int i = n-1; i >=0; i--)map[n-1][i]=1; for(int i = n-1; i >=2; i--)map[i][0]=1; map[2][1]=1; int rec[][] = spiralize(n-4); for(int i = 2; i<n-2; i++){ for(int j = 2; j<n-2; j++){ map[i][j]=rec[i-2][j-2]; } } return map; } }
public class Spiralizor { public static int[][] spiralize(int size) { if(size <= 0) return null; int[][] spiral = new int[size][size]; int minCol = 0; int maxCol = size-1; int minRow = 0; int maxRow = size-1; for (int i = 0; i < spiral.length; i++) { for (int j = 0; j < spiral.length; j++) spiral[i][j] = 0; } while (minRow <= maxRow){ for (int i = minCol; i <= maxCol; i++) spiral[minRow][i] = 1; for (int i = minRow; i <= maxRow; i++) spiral[i][maxCol] = 1; if(minCol != 0) minCol+=1; if(maxRow-1 == minRow) break; for (int i = maxCol-1; i >= minCol; i--) spiral[maxRow][i] = 1; for (int i = maxRow-1; i >= minRow+2; i--) spiral[i][minCol] = 1; minCol+=1; minRow+=2; maxCol-=2; maxRow-=2; } return spiral; } }