一、问题描述
输入两个数字 行数和列数,回形打印出一个二维数组,大小按回形的方向依次递增。
如: 输入: 4 、5
输出:
0 1 2 3
13 14 15 4
12 19 16 5
11 18 17 6
10 9 8 7
二、解题思路
顺着数字的轨迹,你会发现他的打印是一层一层的,即:第一层0-13、第二层为14-19。所以这个问题我们可以将他拆分开来,采用递归来做。
三、实现代码
/**
*
* @param arr 数组
* @param row 行
* @param col 列
* @param level 层数
* @param count 计数
*/
public void travel(int [][] arr, int row, int col, int level, int count) {
//递归出口
if (row - 2 * level == 0 || col - 2 * level == 0) {
return;
}
if (row - 2 * level == 1) {
for (int i = level; i < col -level; ++i) {
arr[level][i] = count++;
}
return;
}
if (col - 2 * level == 1) {
for (int i = level; i < row -level; ++i) {
arr[i][level] = count++;
}
return;
}
/**
* 遍历四条边
*/
for (int i = level; i < col - level; ++i) {
arr[level][i] = count++;
}
for (int i = level + 1; i < row - 1 - level; ++i) {
arr[i][col - 1 - level] = count++;
}
for (int i = col - 1 - level; i >= level; --i){
arr[row - 1- level][i] = count++;
}
for (int i = row - 2 - level; i >= level+1; --i){
arr[i][level] = count++;
}
// 递归
travel(arr, row, col, level + 1, count);
}
/**
* 打印
* @param arr
* @param row
* @param col
*/
public void print(int[][] arr, int row, int col){
for (int i = 0; i < row; ++i){
for (int j = 0; j < col; ++j){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
@Test
public void testTravel() {
int [][] arr = new int[4][5];
travel(arr, 4, 5, 0, 0);
print(arr, 4, 5);
}