问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
解题思路:
要想按下,右,上,左的方向输出数字,为了方便识别已遍历过的数字和未遍历的数字,可以设置一个标记数组。在逆时针转的同时,可以递归,但还要注意最后一个方向的递归可能会出意外,需要while单独处理。但提交会爆栈,只能作为一种思路,不能AC。要想通过只能循环,分别设置四个方向的循环,循环内部做细节操作,最后输出即可。
java代码:(递归)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int m = Integer.parseInt(split[0]);
int n = Integer.parseInt(split[1]);
Temp25 temp = new Temp25(m, n);
int[][]arr = new int[m + 2][n + 2];
for(int i = 1; i <= m;i++) {
split = br.readLine().split(" ");
for(int j = 0; j < split.length;j++) {
arr[i][j + 1] = Integer.parseInt(split[j]);
}
}
temp.arr = arr;
temp.print1();
}
}
class Temp25{
int arr[][];
boolean flag[][];
int m;
int n;
Stack<Integer> stack = new Stack<>();
StringBuilder builder = new StringBuilder();
public void pass() {
for(int i = 1; i <= m;i++) {
for(int j = 1; j <= n;j++) {
flag[i][j] = true;
}
}
}
public void tra(int i,int j) {
if(!flag[i][j]) {
return;
}
flag[i][j] = false;
builder.append(arr[i][j] + " ");
tra(i + 1,j);
tra(i,j + 1);
tra(i - 1,j);
j--;
while(flag[i][j]) {
builder.append(arr[i][j] + " ");
flag[i][j] = false;
j--;
}
tra(i + 1, j + 1);
}
public void print1() {
pass();
tra(1,1);
System.out.print(builder.toString().trim());
}
public Temp25(int m, int n) {
this.m = m;
this.n = n;
arr = new int [m + 2][n + 2];
flag = new boolean [m + 2][n + 2];
}
}
java代码:(循环)
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int m = Integer.parseInt(split[0]);
int n = Integer.parseInt(split[1]);
int count = n * m;
int[][]arr = new int[m + 2][n + 2];
for(int i = 1; i <= m;i++) {
split = br.readLine().split(" ");
for(int j = 0; j < split.length;j++) {
arr[i][j + 1] = Integer.parseInt(split[j]);
}
}
boolean [][]flag = new boolean[m + 2][n +2];
for(int i = 1; i <= m;i++) {
for(int j = 1; j <= n;j++) {
flag[i][j] = true;
}
}
int i = 1;
int j = 1;
StringBuilder builder = new StringBuilder();
while(count != 0) {
while(flag[i][j]) {
builder.append(arr[i][j] + " ");
flag[i][j] = false;
i++;
count--;
}
i--;
j++;
while(flag[i][j]) {
builder.append(arr[i][j] + " ");
flag[i][j] = false;
j++;
count--;
}
j--;
i--;
while(flag[i][j]) {
builder.append(arr[i][j] + " ");
flag[i][j] = false;
i--;
count--;
}
i++;
j--;
while(flag[i][j]) {
builder.append(arr[i][j] + " ");
flag[i][j] = false;
j--;
count--;
}
i++;
j++;
}
System.out.print(builder.toString().trim());
}
}