要求
打印一个旋转自增的矩阵。矩阵效果如下:
1,2,3
8,9,4
7,6,5
随机给定一个正整数,打印他的旋转自增矩阵,以上矩阵就是3的旋转自增矩阵。
思路解析
以圈的形式进行矩阵数据的记录。例如上面的示例,包含两圈。外圈为1,2,3,4,5,6,7,8.内圈为9.那对于不同长度的矩阵,所包含的圈数是不一样的。
一个圈在行或者列上都应该是有两个边的。例如1,2,3这条边和7,6,5这条边。每个圈的数据都是顺序递增的。那就根据这个思路进行解析。
给定一个数,那么它的圈数应该为 n/2 + n%2。选择2的原因就是因为一个圈在行或者列上应该同时存在两个。
思路确定,那么要做的就是对每圈的数据进行存储。
代码解析
以圈为维度进行数据处理。解析完外层圈后,记录边长位置,进行内层圈的解析
public static void main(String[] args) {
int n = 6;
int[][] arrs = new int[n][n];
//定义边界
int rowBegin = 0;
int rowEnd = n;
int colBegin = 0;
int colEnd = n;
//当前的数据
int num = 0;
//循环圈数
for(int i = 0; i < (n/2 + n%2); i++){
//顶
for(int row = rowBegin; row < rowEnd; row++){
int[] arr = arrs[i];
arr[row] = ++num;
}
//右侧
for(int col = colBegin+1; col < colEnd; col++){
int[] arr = arrs[col];
arr[rowEnd-1] = ++num;
}
//底
for(int row = rowEnd-2; row >= rowBegin; row--){
int[] arr = arrs[rowEnd-1];
arr[row] = ++num;
}
//左侧
for(int col = colEnd -2; col > colBegin; col--){
int[] arr = arrs[col];
arr[rowBegin] = ++num;
}
rowBegin++;
rowEnd--;
colBegin++;
colEnd--;
}
for(int i = 0 ; i < arrs.length; i++){
System.out.println(Arrays.toString(arrs[i]));
}
}