顺时针方向循环输出矩阵
- 一、题目描述
- 二、实现思路
- 三、代码示例
- 四、测评结果
- (1)4 x 4 矩阵:
- (2)3 x 3 矩阵:
一、题目描述
使用二维数组构建一个矩阵,按照顺时针方向循环输出矩阵内的元素。
如下图所示的矩阵的顺时针方向循环输出的结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
二、实现思路
- 如上图所示,整体上是由外到内进行顺时针循环遍历,我们可以将遍历过程分为四部分,分别是:
从左到右、从上到下、从右到左,从下到上。 - 矩阵分为行和列,我们可以定义四个变量分别来保存矩阵行和列的起点和终点,如上图所示的,left、top、right、bottom
- 首先从左到右遍历,此时在从左到右遍历的一个周期内只有列在增加,而行不发生变化,直到一个遍历周期结束了,行
的起点自加一,当行的起点大于行的终点时退出循环。
// 从左到右
for (int i = left; i < right; i++) {
System.out.print(arr[top][i] + " ");
}
top++; // 行的遍历起点加一
if (top > bottom) { // 如果 行的起点 大于 行的终点则退出循环遍历
break;
}
- 然后从上到下遍历,此时在从上到下遍历的一个周期内只有行在增加,而列不发生变化,直到一个遍历周期结束了,列
的终点自减一,当列的起点大于列的终点时退出循环。
// 从上到下
for (int i = top; i < bottom; i++) {
System.out.print(arr[i][right - 1] + " ");
}
right--; // 列的遍历终点减一
if (left > right) { //如果 列的起点 大于 列的终点则退出循环
break;
}
- 接着从右到左遍历,此时在从右到左遍历的一个周期内只有列在减小,而行不发生变化,直到一个遍历周期结束了,行的终点自减一,当行的终点小于行的起点时退出循环。
// 从右到左
for (int i = right - 1; i >= left; i--) {
System.out.print(arr[bottom - 1][i] + " ");
}
bottom--; // 行的遍历终点减一
if(top > bottom){ //如果 行的起点 大于 行的终点则退出循环
break;
}
- 最后从下到上遍历,此时在从下到上遍历的一个周期内只有行在减小,而列不发生变化,直到一个遍历周期结束了,列的终点自减一,当列的终点小于列的起点时退出循环
// 从下到上
for(int i = bottom - 1;i>=top;i--){
System.out.print(arr[i][left] + " ");
}
left++; // 列的遍历起点加一
if(left > right){ //如果 列的起点 大于 列的终点则退出循环
break;
}
- 补充:之所以在循环遍历时要进行 行 和 列 的加减变化,是为了实现矩阵从外到内循环遍历这一目的。
三、代码示例
package com.easy.java;
/**
* @ClassName Test05
* @Description 顺时针循环输出矩阵
* @Author wk
* @Date 2021/11/14 22:31
* @Version 1.0
*/
public class Test05 {
public static void main(String[] args) {
int arr[][] = new int[4][4];
int count = 1;
//初始化数组
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j] = count;
count++;
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
System.out.println();
//循环输出
int left = 0; // 列的起点
int right = arr[0].length; // 列的终点
int top = 0; // 行的起点
int bottom = arr.length; // 行的终点
while (true) {
// 从左到右
for (int i = left; i < right; i++) {
System.out.print(arr[top][i] + " ");
}
top++;
if (top > bottom) {
break;
}
// 从上到下
for (int i = top; i < bottom; i++) {
System.out.print(arr[i][right - 1] + " ");
}
right--;
if (left > right) {
break;
}
// 从右到左
for (int i = right - 1; i >= left; i--) {
System.out.print(arr[bottom - 1][i] + " ");
}
bottom--;
if(top > bottom){
break;
}
// 从下到上
for(int i = bottom - 1;i>=top;i--){
System.out.print(arr[i][left] + " ");
}
left++;
if(left > right){
break;
}
}
}
}
四、测评结果
(1)4 x 4 矩阵:
(2)3 x 3 矩阵: