一、問題描述
輸入兩個數字 行數和列數,回形打印出一個二維數組,大小按回形的方向依次遞增。
如: 輸入: 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);
}
輸出結果.png