打印回形数组
程序员文章站
2022-03-06 11:05:51
...
前段时间面试的时候被问到打印回形数组,当时只写了个大概,后来网上看了下,也实现得麻烦,就重新写了下,
题目:输入一个整数N,打印出从1~N*N的N*N矩阵。
比如N = 3,构成矩阵:
1,2,3,
8,9,4,
7,6,5,
比如N = 4,构成矩阵:
1, 2, 3, 4,
12,13,14, 5,
11,16,15, 6,
10, 9, 8, 7,
N=5时,构成矩阵:
1, 2, 3, 4, 5,
16,17,18,19, 6,
15,24,25,20, 7,
14,23,22,21, 8,
13,12,11,10, 9,
对于输入的整数,安行输出回形矩阵。
思路就是按照回形数组的规则,第一行先向右存放数组,然后折行向下,然后向左,最后向上,形成回形。
只用循环一次就可以了(看了几篇文章,用了几层循环,较麻烦)
枚举类,用来代表“上下左右”四个方向
public enum DirectionEnum{
RIGHT(1,"向右"),
DOWN(2,"向下"),
LEFT(3,"向左"),
UP(0,"向上");
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
DirectionEnum(int code, String description) {
this.code = code;
this.description = description;
}
private int code;
private String description;
public static DirectionEnum getDirectionByCode(int code){
for (DirectionEnum directionEnum : DirectionEnum.values()) {
if (directionEnum.getCode() == code) {
return directionEnum;
}
}
return null;
}
}
算法实现
private int[][] algorithm(int n){
int length=n*n;
int [][]result=new int[n][n];
int direction=1;
int i=0,j=0;
for (int k=1;k<=length;k++){
result[i][j]=k;
DirectionEnum directionEnum=DirectionEnum.getDirectionByCode(direction%4);
switch (directionEnum){
case RIGHT:{
if (j==n-1||result[i][j+1] != 0){
i++;
direction++;//改变方向
}else{
j++;
}
}break;
case DOWN:{
if (i==n-1||result[i+1][j]!=0){
j--;
direction++;//改变方向
}else{
i++;
}
}break;
case LEFT:{
if (j==0||result[i][j-1]!=0){
i--;
direction++;//改变方向
}else{
j--;
}
}break;
case UP:{
if (i==0||result[i-1][j]!=0){
j++;
direction++;//改变方向
}else{
i--;
}
}break;
default:
}
}
return result;
}
算法调用及打印输出
public void dotest(){
int n=11;
int maxNumLength=String.valueOf(n*n).length();
int [][] result=algorithm(n);
//格式化打印输出
for ( int i=0;i<result.length;i++){
for(int j=0;j<result[i].length;j++){
System.out.print(String.format("%"+maxNumLength+"d",result[i][j])+",");
}
System.out.println();
}
}
运行结果如下图:
上一篇: Python练习task10:类与对象
下一篇: JavaSE练习(四)——类与对象