蓝桥杯练习系统之基础训练Java版(2-25)—— 回形取数
**难度等级:中等**
**关键字:二维数组 循环**
问题描述:
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式:
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式:
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入:
3 3
1 2 3
4 5 6
7 8 9
样例输出:
1 4 7 8 9 6 3 2 5
样例输入:
3 2
1 2
3 4
5 6
样例输出:
1 3 5 6 4 2
代码如下:
import java.util.Scanner;
public class Main {
static int s = 0, count = 0;
static int m, n;
static int[][] b = new int[205][205]; // 用来标记是否已经读取过
static int[][] a = new int[205][205];
static void f(int i,int j){
if (i < m && i >= 0 && j < n && j >= 0 && b[i][j] == 0) {
System.out.print(a[i][j] + " ");
count++;
b[i][j] = 1; // b[i][j] = 1表示所在行列已经读取过
} else {
s++;
return;
}
while(count <= m * n) { // 当执行完上下左右的一轮读数后,还没有全部读到,则循环...
if (s % 4 == 0) // 往下
f(i + 1, j);
if (s % 4 == 1) // 往右
f(i, j + 1);
if (s % 4 == 2) // 往上
f(i - 1, j);
if (s % 4 == 3) // 往左
f(i, j - 1);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
m = sc.nextInt();
n = sc.nextInt();
int i, j;
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
a[i][j] = sc.nextInt();
}
}
f(0, 0);
}
}
希望能对您有帮助!谢谢。