问题描述
逆时针打印出矩阵数字,回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
1 2
3 4
5 6
样例输出
1 3 5 6 4 2
思考
刚开始尝试用几个while循环解答出来了,但是觉得代码有点啰嗦,所以考虑更简洁的解法,想到了递归方法,矩阵可以理解为一圈一圈的数字套在一起,所以我们只要求出每一圈的数字,然后递归计算下一层,一次解答即可,这样代码很简洁了,更让人容易理解。
算法
/**
* @author lyh
* @date 2019/11/11 0011
**/
public class ClipMatrix {
/**
* 逆时针打印矩阵,回形取数
*
* @param nums 二维数组
*/
public void output(int[][] nums) {
output(nums, 0, 0, nums.length, nums[0].length);
}
/**
* 逆时针打印矩阵,回形取数
*
* @param nums 二维数组
* @param rowIndex 开始行索引
* @param columnIndex 开始列索引
* @param rowCount 行的数字个数
* @param columnCount 列的数字个数
*/
public void output(int[][] nums, int rowIndex, int columnIndex, int rowCount, int columnCount) {
if (rowCount < 1 || columnCount < 1) {
return;
}
//取左边的数,共 rowCount 个
for (int i = 0; i < rowCount; i++) {
System.out.print(nums[rowIndex + i][columnIndex] + " ");
}
//取下边的数,共 columnCount-1 个
for (int i = 0; i < columnCount - 1; i++) {
System.out.print(nums[rowIndex + rowCount - 1][columnIndex + 1 + i] + " ");
}
//取右边的数,共 rowCount-1 个
for (int i = 0; i < rowCount - 1; i++) {
System.out.print(nums[rowIndex + rowCount - 2 - i][columnIndex + columnCount - 1] + " ");
}
//取上边的数,共 columnCount-2 个
for (int i = 0; i < columnCount - 2; i++) {
System.out.print(nums[rowIndex][columnIndex + columnCount - 2 - i] + " ");
}
//递归下一圈的数字
output(nums, columnIndex + 1, rowIndex + 1, rowCount - 2, columnCount - 2);
}
public static void main(String[] args) {
ClipMatrix cm = new ClipMatrix();
int m = 3;
int n = 3;
int[][] nums = new int[m][n];
int num = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
nums[i][j] = ++num;
System.out.print(nums[i][j] + " \t");
}
System.out.println(" ");
}
System.out.println("--------------------------------");
cm.output(nums);
}
}