转圈打印矩阵(二维数组)中的元素
如图所示,假设给定一个N*N (N=4)的矩阵并且初始值左图中单元格所示,要求按照右图所示的情况打印矩阵元素。
算法分析
定义4个变量top、bottom、left、right分别控制元素坐标位置。
初始化时:top = 0;left = 0 ;bottom = n-1;right = n-1。
转圈打印的方向是顺时针:
从左向右;从上向下;从右向左;在从下向上。
声明一个二维数组 array具有N行N列
声明一个变量
;
从左向右,从上向下:当 并且 时满足打印条件
从左向右:
从上向下:
从右向左:
从下向上:
算法设计参考下面代码的注释,while循环中是按照从左向右,从上向下,从右向左,从下向上的顺序转圈赋值。
public static int[][] generateMatrix(int n) {
int[][] rs = new int[n][n];
int top = 0,bottom = n-1,left = 0,right = n-1;
int num = 1;
//边界条件是 left<=right 同时 top<=bottom
while(left<=right && top <=bottom){
/* * 从左向右 * 初次,当left=0时,rs[top][i]表示第一行的元素, * i=left=0;赋值之后 i++,表示从第一行第一列的元素到第一行最后一个元素依次赋值, * 然后top++,表示下移一行,到第二行。 * */
for(int i=left;i<=right;i++){
rs[top][i] = num++;
}
top++;//向下移动一行
/* * 从上到下 * 当i=1,i<=bottom;i++ * rs[i][right]表示从rs[1][n-1]到rs[n-1][n-1]依次赋值, * 即为矩阵最右边一列元素,从上到下依次赋值 * 然后right--表示将最后一列列赋值之后数组下标依次向倒数第二列,倒数第三列移动 * */
for(int i= top;i<=bottom;i++){
rs[i][right] = num++;
}
right--;
/* * 从右向左 * i从倒数第二列开始,当i>=left;i-- * rs[bottom][i]表示从矩阵的最后一行的倒数第二个元素开始依次从右向左赋值并移动 * bottom--,表示赋值之后从下向上移动一行 * * */
for(int i= right;i>=left;i-- ){
rs[bottom][i] = num++;
}
bottom--;
/* * 从下向上 * 当i=bottom;i>=top;i-- * 表示从倒数第二行开始依次给最左边的列开始赋值,第一次赋值时left=0,代表矩阵的第一列 * 当left++后,表示移动到矩阵的第二列 * */
for(int i = bottom;i>=top;i--){
rs[i][left] = num++;
}
left++;
}
return rs;
}
完整的测试代码如下
package com.bean.algorithmexec;
public class MatrixDemo {
/* * 给定一个整形矩阵Matrix,请按照顺时针方向转圈的方式,输入(打印)元素值。 * 例如: * 1 2 3 4 * 5 6 7 8 * 9 10 11 12 * 13 14 15 16 * 输出结果为: * 1 2 3 4 * 12 13 14 5 * 11 16 15 6 * 10 9 8 7 * * */
/* * 转圈打印矩阵元素(顺时针转圈) * */
public static int[][] generateMatrix(int n) {
int[][] rs = new int[n][n];
int top = 0,bottom = n-1,left = 0,right = n-1;
int num = 1;
//边界条件是 left<=right 同时 top<=bottom
while(left<=right && top <=bottom){
/* * 从左向右 * 初次,当left=0时,rs[top][i]表示第一行的元素, * i=left=0;赋值之后 i++,表示从第一行第一列的元素到第一行最后一个元素依次赋值, * 然后top++,表示下移一行,到第二行。 * */
for(int i=left;i<=right;i++){
rs[top][i] = num++;
}
top++;//向下移动一行
/* * 从上到下 * 当i=1,i<=bottom;i++ * rs[i][right]表示从rs[1][n-1]到rs[n-1][n-1]依次赋值, * 即为矩阵最右边一列元素,从上到下依次赋值 * 然后right--表示将最后一列列赋值之后数组下标依次向倒数第二列,倒数第三列移动 * */
for(int i= top;i<=bottom;i++){
rs[i][right] = num++;
}
right--;
/* * 从右向左 * i从倒数第二列开始,当i>=left;i-- * rs[bottom][i]表示从矩阵的最后一行的倒数第二个元素开始依次从右向左赋值并移动 * bottom--,表示赋值之后从下向上移动一行 * * */
for(int i= right;i>=left;i-- ){
rs[bottom][i] = num++;
}
bottom--;
/* * 从下向上 * 当i=bottom;i>=top;i-- * 表示从倒数第二行开始依次给最左边的列开始赋值,第一次赋值时left=0,代表矩阵的第一列 * 当left++后,表示移动到矩阵的第二列 * */
for(int i = bottom;i>=top;i--){
rs[i][left] = num++;
}
left++;
}
return rs;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] result=generateMatrix(4);
printMatrix(result);
}
//顺序打印矩阵元素
private static void printMatrix(int[][] matrix) {
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
System.out.print(matrix[i][j]+"\t");
}
System.out.println();
}
}
}
运行结果:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
(完)