Make a spiral

kata programming

مساله:

وظیفه شما این است که یک مارپیچ 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;
    }
}

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.