Java数组算法——回型数
问题描述
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
方法一:设置四个方向
import java.util.Scanner;
public class HuiXingShu {
private static final int RIGHT = 1;
private static final int DOWN = 2;
private static final int LEFT = 3;
private static final int UP = 4;
public static void main(String[] args) {
/***
* problem describe
* 从键盘中输入1-20范围的整数,则以该数字为矩阵大小,把1,2,3,...n*n的数字按照顺时针螺旋的形式填入。
*/
Scanner scan = new Scanner(System.in);
System.out.print("请输入1-20的整数:");
int num = scan.nextInt();
int[][] huiXingShu = new int[num][num];
int count = num * num;
int dir = RIGHT; //设置赋值的方向
int i = 0, j = 0;
//方法一:方向思路,设置四个方向
for (int m = 1; m < count+1; m++) {
switch (dir) {
case RIGHT:
if (j < num && huiXingShu[i][j] == 0)
huiXingShu[i][j++] = m;
else {
dir = DOWN;
i++;
j--;
m--; //因为运行这个else的时候m多加了
}
break;
case DOWN:
if (i<num&&huiXingShu[i][j]==0)
huiXingShu[i++][j] = m;
else {
dir = LEFT;
i--;
j--;
m--;
}
break;
case LEFT:
if(j>=0&&huiXingShu[i][j]==0)
huiXingShu[i][j--] = m;
else {
dir = UP;
j++;
i--;
m--;
}
break;
case UP:
if(i>=0&&huiXingShu[i][j]==0)
huiXingShu[i--][j] = m;
else {
dir = RIGHT;
i++;
j++;
m--;
}
break;
}
}
for(int[] Arr1:huiXingShu){
for (int Arr2:Arr1){
System.out.print(Arr2+"\t");
}
System.out.println();
}
System.out.println();
}
}
方法二:根据下标赋值
//方向二:下标思路,根据下标来
System.out.print("请输入1-20的整数:");
int num1 = scan.nextInt();
int[][] huiXingShu1 = new int[num1][num1];
int maxX = num1-1;
int minX = 0;
int maxY = num1-1;
int minY = 0;
int cnt = 0;
while (minX<=maxX){
for(int y = minY;y<=maxY;y++)
huiXingShu1[minX][y] = ++cnt;
minX++;
for(int x = minX;x<=maxX;x++)
huiXingShu1[x][maxY] = ++cnt;
maxY--;
for(int y = maxY;y>=minY;y--)
huiXingShu1[maxX][y] = ++cnt;
maxX--;
for(int x = maxX;x>=minX;x--)
huiXingShu1[x][minY] = ++cnt;
minY++;
}
for(int[] Arr1:huiXingShu1){
for (int Arr2:Arr1){
System.out.print(Arr2+"\t");
}
System.out.println();
}