2016-04-14 16 views
-3

私は1から始まる連続番号の行列を生成したい、 zig zag matrix印刷要素

public static int[][] Zig_Zag(final int size) { 
     int[][] data = new int[size][size]; 
     int i = 1; 
     int j = 1; 
     for (int element = 0; element < size * size; element++) { 
      data[i - 1][j - 1] = element; 
      if ((i + j) % 2 == 0) { // Even stripes if (j < size) j++; else i+= 
            // 2; if (i > 1) i--; } else { // Odd 
            // stripes if (i < size) i++; else j+= 2; if 
            // (j > 1) j--; } } return data; } 
      } 
     } 
     return data; 
    } 

誰も助けることができますか?

+1

あなたはまだ何を試してみましたか? SOはコード生成プラットフォームではありません。 – SomeJavaGuy

+0

私はそのフォームで印刷することができますが、最初のインデックスからのみ開始します – Sigma

+0

ようこそStackOverflow。良い質問は、あなたが達成したい(あなたが持っている)、これまでに試したこと(あなたの質問から欠けている)、そして何が間違っているのか(欠けている)である。それは** _ _ _ _の問題を助けることです。 –

答えて

2

この

public static int[][] Zig_Zag(int size) { 
    int[][] a = new int[size][size]; 
    int n = 1; 
    for (int r = size, c = 0; r >= 0; --r) 
     for (int i = r, j = c; i < size; ++i, ++j) 
      a[i][j] = n++; 
    for (int r = 0, c = 1; c < size; ++c) 
     for (int i = r, j = c; j < size; ++i, ++j) 
      a[i][j] = n++; 
    return a; 
} 

をお試しください
int[][] a = Zig_Zag(4); 
for (int[] r : a) 
    System.out.println(Arrays.toString(r)); 

結果:

[7, 11, 14, 16] 
[4, 8, 12, 15] 
[2, 5, 9, 13] 
[1, 3, 6, 10] 
+0

それは動作します。ありがとう! – Sigma

0

このコードを試してみてください。

public static int[][] Zig_Zag(final int size) { 
     int[][] data = new int[size][size]; 
     int i = 1; 
     int j = 1; 
     for (int element = 1; element <= size * size; element++) { 
      data[i - 1][j - 1] = element; 
      if ((i + j) % 2 == 0) { 
       // Even stripes 
       if (j < size) 
        j++; 
       else 
        i += 2; 
       if (i > 1) 
        i--; 
      } else { 
       // Odd stripes 
       if (i < size) 
        i++; 
       else 
        j += 2; 
       if (j > 1) 
        j--; 
      } 
     } 
     return data; 
    } 

    public static void main(String[] args) { 
     int[][] data = Zig_Zag(4); 
     for(int i=0; i<data.length;i++){ 
      for(int j=0; j<data[i].length;j++){ 
       System.out.print(data[i][j]+" "); 
      } 
      System.out.println(""); 
     } 
    } 

出力:

1 2 6 7 
3 5 8 13 
4 9 12 14 
10 11 15 16 
+0

これは私のコードです。私は、左上ではなく左下から印刷を開始する必要があります。私はインデックスを変更しようとしましたが、それはうまく動作しません。 – Sigma

0

ない非常にエレガントなソリューション:

private static int triangle_below(int n) { 
    return n * (n + 1)/2; 
} 

private static int except_triangle_above(int size, int n) { 
    return size * size - triangle_below(2 * size - n); 
} 

private static int[][] gen(int size) { 
    int[][] m = new int[size][size]; 

    for (int i = 0; i < size; ++i) { 
     for (int j = 0; j < size; ++j) { 
      // already filled cells in lower diagonal layers 
      int k = Math.min(
       triangle_below(i + j), 
       except_triangle_above(size, Math.max(size, i + j + 1)) 
      ); 

      // position in current layer 
      int l = Math.min(j + 1, size - i); 

      m[size - i - 1][j] = k + l; 
     } 
    } 

    return m; 
}