Java螺旋填数
新手的Java练习,用了最原始,最基础的方法完成螺旋填数
首先,题目为:
读入两个整数m,n,输出一个m行n列的矩阵,这个矩阵是1~m*n这些自然数按照右、下、左、上螺旋填入的结果。 例如读入数字4,5,则输出结果为:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
主要思路为:填入数字时,分为四种情况,当为右时,行下标不变,列下标+1.当为下时,行下标+1列下标不变,当为左时,行下标不变,列-1,当为上时,行下标-1,列下标不变.同时,每运行一次情况,行和列需要填入的元素个数,-1;
代码如下:
// An highlighted block
private static Scanner input;
public static void main(String[] args) {
input = new Scanner(System.in);
int row = input.nextInt();// 输入行
int col = input.nextInt();// 输入列
int[][] arr = new int[row][col];//声明二维数组
int total = row * col;// 总循环次数
int type = 1;// 右,下,左,上四种走法,初始默认第一种向右走法
int i = 0;// 数组下标:行下标
int j = 0;// 数组下标:列下标
for (int count = 1; count <= total;) {
switch (type) {
case 1: {
for (int n = 0; n < col; n++, count++) {
arr[i][j++] = count;
}
type += 1;//赋值完成后,下一次换一种走法
row -= 1;//下一次对列赋值,将减小1
j -= 1;//索引多加1,减去还原索引
i += 1;//下一次使用i时,将从后一个元素赋值
break;
}
case 2: {
for (int n = 0; n < row; n++, count++) {
arr[i++][j] = count;
}
type += 1;//赋值完成后,下一次换一种走法
col -= 1;//下一次对列赋值,将减小1
i -= 1;//索引多加1,减去还原索引
j -= 1;//下一次使用j时,将从后一个元素赋值
break;
}
case 3: {
for (int n = 0; n < col; n++, count++) {
arr[i][j--] = count;
}
type += 1;//赋值完成后,下一次换一种走法
row -= 1;//下一次对列赋值,将减小1
j += 1;//索引多加1,减去还原索引
i -= 1;//下一次使用i时,将从后一个元素赋值
break;
}
case 4: {
for (int n = 0; n < row; n++, count++) {
arr[i--][j] = count;
}
type = 1;//赋值完成后,下一次换一种走法
col -= 1;//下一次对列赋值,将减小1
i += 1;//索引多加1,减去还原索引
j += 1;//下一次使用j时,将从后一个元素赋值
break;
}
}
}
for (int n = 0; n < arr.length; n++) {
System.out.println(Arrays.toString(arr[n]));//遍历数组,打印结果
}
}
感觉这个方法过于冗长和复杂,希望大家不吝指教,帮忙修改,毕竟初学者能力有限.