问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
思路
回形嘛,首先想到的就是四步
![自己画的粗略图,有点丑](https://img-blog.csdnimg.cn/20190323192544499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjc3OTM3MA==,size_16,color_FFFFFF,t_70
一二三四步是总的大纲,可以看成成四步是一个循环,五六七八就是在前四部的稍微变形,判断跳出循环的条件就是一共进行了m*n次.
总数据是一个二维数组,开始四步的起点是(0,0),后四步的起点是(1,1)以此类推就行了。
public class Main {
static int count = 0;
static StringBuffer str = new StringBuffer();//存放结果,stringBuffer的效率更高
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int m = scan.nextInt();
int n = scan.nextInt();
int[][] array = new int[m][n];//二维数组
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
array[i][j] = Integer.parseInt(scan.next());
}
}
int a = 0;//起点,每四步循环一个新的起点
int c = m * n;//一共要循环几步
while (count < c) {
m--;
n--;
new Main().get(m, n, a, c, array);
a++;
}
System.out.println(str);
}
public void get(int m, int n, int a, int c, int[][] array) {
for (int i = a; i <= m; i++) {
if (count == c) {//没次都要判断是否循环完毕,这里才是决定性的要素
return; //要先判断是否满足条件
}
str.append(array[i][a] + " ");
count++;
}
for (int i = a + 1; i <= n; i++) {
if (count == c) {
return;
}
str.append(array[m][i] + " ");
count++;
}
for (int i = m - 1; i >= a; i--) {
if (count == c) {
return;
}
str.append(array[i][n] + " ");
count++;
}
for (int i = n - 1; i > a; i--) {
if (count == c) {
return;
}
str.append(array[a][i] + " ");
count++;
}
}
}