用字符填充矩阵,使它们形成一个整齐的十字,其中每个较小的对角线是 (char + 1)
Filling matrix with characters so they form a neat cross, where every lesser diagonal is (char + 1)
目标是绘制此模式,其中 N 在 [4,100] 范围内。主对角线总是 'a'
,a
的邻居应该是 b
,b
的邻居应该是 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 的尺寸,你必须顺便调整一下之前的答案(我猜是在某处添加模数)。
目标是绘制此模式,其中 N 在 [4,100] 范围内。主对角线总是 'a'
,a
的邻居应该是 b
,b
的邻居应该是 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 的尺寸,你必须顺便调整一下之前的答案(我猜是在某处添加模数)。