用字符填充矩阵,使它们形成一个整齐的十字,其中每个较小的对角线是 (char + 1)

Filling matrix with characters so they form a neat cross, where every lesser diagonal is (char + 1)

目标是绘制此模式,其中 N 在 [4,100] 范围内。主对角线总是 'a'a 的邻居应该是 bb 的邻居应该是 c 等等。如果我们已经迭代到 z 字符 - 切换到 a 返回。

下面的代码试图绘制一个更简单的模式,但对角线从左下角到右上角,我的索引很差:\

import java.util.*;

class Solution {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int number = sc.nextInt();

        char[][] array = new char[number][number];

        char paint = 'a';

        for (int t = 0; t < (number * number - 2); t++) {
            for (int k = 0; k < number; k++) {
                for (int j = 0; j < number; j++) {
                    if (k + j == t) {
                        array[k][j] = paint;
//                        System.out.print(array[k][j] + " ");
                    }
                }

            }
            if (paint == 123) {
                paint = (char) 97;
            } else {
                paint += 1;
            }
            

        for (char[] row : array)
        {
            System.out.println(Arrays.toString(row));
        }
    }
}

n = 5 的绘图:

[a, b, c, d, e]
[b, c, d, e, f]
[c, d, e, f, g]
[d, e, f, g, h]
[e, f, g, h, i]

我认为对角线上的每个元素的索引总和相等,但是还有另一种模式使用中间中心交叉,它充当对称线但计算出矩阵的索引公式象限超出了我的范围。

有什么建议吗?

你遇到的这个问题很有趣。我想我想出了一个解决方案,但首先让我解释一下我是如何想到它的。

我认为可以简单地遍历矩阵的所有元素,并根据某种算法决定字符,而不是动态更改字符。

看来,正如您所指出的,您的矩阵实际上是高度对称的,并且四个象限是相关的。这意味着您可能只在两个方向上沿着矩阵的一半,并使用正确的字符一次设置四个元素(每个象限一个)。

为简单起见,从均匀大小的矩阵开始,您可以找到与左上象限中索引 i,j 处的字符对应的公式。这是定义 indexLetter 的公式。使用对称性,可以直接在其他象限中设置每个对应的元素。

如果你想要一个奇数大小的矩阵,那几乎是一样的,除了你需要取 (N+1)/2 而不是 N/2。

给出下一个结果:

import java.util.*;

class Solution {

    final static String alphabet = "abcdefghijklmnopqrstuvwxyz";

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int number = sc.nextInt();

        char[][] array = new char[number][number];

        for(int i = 0; i < Math.floor((number+1)/2); i++)
        {    
            for (int j = 0; j < Math.floor((number+1)/2); j++)
            {
                //determine the index of the right character 
                //using some arithmetics

                //next number works for both even and odd inputed number
                int nbLetters = (int)Math.floor((number+1)/2);
                int indexLetter = Math.abs(j - i) % nbLetters;
                
                //set it back in all parts of the graphs
                array[i][j] = alphabet.charAt(indexLetter);
                array[i][number-j-1] =  alphabet.charAt(indexLetter);
                array[number-i-1][j] =  alphabet.charAt(indexLetter);                
                array[number-i-1][number-j-1] =  alphabet.charAt(indexLetter);
            }
        }

        //print it back
        for (char[] row : array)
        {
            System.out.println(Arrays.toString(row));
        }
    }
}

注意:如果你想取大于 52 的尺寸,你必须顺便调整一下之前的答案(我猜是在某处添加模数)。