基础练习 回形取数 java 题解 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

解题思路:

要想按下,右,上,左的方向输出数字,为了方便识别已遍历过的数字和未遍历的数字,可以设置一个标记数组。在逆时针转的同时,可以递归,但还要注意最后一个方向的递归可能会出意外,需要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());
	}
}

提交截图:

Guess you like

Origin blog.csdn.net/weixin_48898946/article/details/120816309