62,614
社区成员
发帖
与我相关
我的任务
分享
public class Test {
public static void main(String[] args) throws Throwable {
int n = 4;
showMatrix(n);
System.out.println();
showMatrix2(n);
}
public static void showMatrix(int n) {
int[][] matrix = new int[n][n];
for (int i=0,r=0,c=0,d=0; i<n*n; i++) {//循环矩阵,r代表行,c代表列,d代表方向
if (r==0 && c==0) { //第一个元素,输出该元素后,列右移1个位置
matrix[r][c++] = i+1;
} else if (d == 0) { //负对角线方向控制
matrix[r++][c--] = i+1; //输出该元素后,行下移1个位置,列左移1个位置
if (c < 0 || r == n) { //到达边界的时候
d = 1; //改变方向
c++; //重新整理列的位置
if (r == n) {//重新整理行和列的位置
r--;
c++;
}
}
} else { //正对角线方向
matrix[r--][c++] = i+1;//输出该元素后,行上移1个位置,列右移1个位置
if (r < 0 || c == n) { //到达边界的时候
d = 0; //改变方向
r++; //重新整理行位置
if (c == n) {//重新整理行和列位置
c--;
r++;
}
}
}
}
for (int i=0; i<matrix.length; i++) { //打印矩阵
for (int j=0; j<matrix[i].length; j++) {
System.out.printf("%-2d ", matrix[i][j]);
}
System.out.println();
}
}
public static void showMatrix2(int n) { //这个方法就不解释了
int[][] matrix = new int[n][n];
for (int i=0,w=1,r=0,c=0,d=0; i<n*n; i++) {
if (r==0 && c==0) {
matrix[r][c++] = i+1;
} else if (d == 0) { //垂直方向
matrix[r++][c] = i+1;
if (r > w || r == n) {
d = 1;
r--;
c--;
}
} else { //水平方向
matrix[r][c--] = i+1;
if (c < 0) {
w++;
d = 0;
r = 0;
c = w;
}
}
}
for (int i=0; i<matrix.length; i++) {
for (int j=0; j<matrix[i].length; j++) {
System.out.printf("%-2d ", matrix[i][j]);
}
System.out.println();
}
}
}