-3

この形式のジグザグ行列で、1から始まる連続した番号を持つ行列を生成したい

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;
    }

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

4

3 に答える 3

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;
}
于 2016-04-14T12:39:29.973 に答える