我正在处理一个问题,我需要以下列格式打印N * N多维数组:如果N = 3,那么:
4 2 1
7 5 3
9 8 6
我坚持为此编写for循环。我无法获得逻辑或如何开始打印值。
我的代码:
import java.util.Scanner;
public class Hotel {
public static void main(String[] args) {
int N=1, x=1, y=0, f=1;
Scanner in = new Scanner(System.in);
System.out.println("Enter the size of square: ");
x = in.nextInt();
if (x>=1 && x<=100) {
N = x;
}
y=N*N;
int[][] arr = new int[N][N];
arr[0][N-1] = f;
arr[N-1][0] = y;
for(int i=0; i<N;i++) {
for (int j=0;j<N;j++) {
-------------------------------
}
}
for(int i=0; i<N;i++) {
for (int j=0;j<N;j++) {
System.out.print(arr[i][j] + " "); // Printing a 2d array
}
System.out.println(" ");
}
in.close();
}
}
我的输出根据我的代码:
0 0 1
0 0 0
9 0 0
内部for循环,我无法获得逻辑。如果你可以帮助我提供一个逻辑,我会尝试解决它。请帮助
答案 0 :(得分:2)
在解决这样的问题时,你应该以非常系统的方式思考你正在采取的步骤。基本上,你应该背诵你希望算法对自己采取的每一步,而不做任何推理&#39;。
你不所做的事情是:
&#34;好的,我把2放在中上部位置,所以现在我需要向右倾斜到右边。&#34;
您需要找到您想要做的模式。在这种情况下,您想要制作对角线数字,因此您需要检测何时开始新线。 你什么时候开始新的一行?当然,一旦完成当前的一个。线何时完成?当(x + 1,y + 1)没有合法点时,你当前的点是(x,y)。
因此,您的算法应该检测到这种情况,然后找到下一行的起始位置。你的下一行从哪里开始?如果您只存储上一个行的起点坐标,那么它应该比那些少一些。
您现在知道从哪里开始和结束您的线路,所以现在您只需要初始化和终止您的算法。
右上角的位置始终为1,因此您可以立即将其放入。你有一个额外的变量存储x-cooridnates,所以你需要将它设置为你的第一行&#39;的值,即N-1。现在,如上所述的算法将看到该行无法继续,并开始下一行。
您的算法何时终止?有几种方法可以做到这一点,但最简单的方法是简单地查看下一步要输入的数字。您的方格是N * N,因此应该是输入的最大数字。如果您检测到 输入的下一个号码将是N * N + 1,那么您就完成了。或者,你可以查看你的“x&#39;”,如果小于0,你将无法再写下任何值。