蓝桥杯回形取数

回形取数

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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 {

	public static void main(String[] args) {
    Scanner scan=new Scanner(System.in);
    int m,n;
	m=scan.nextInt();
	n=scan.nextInt();
    int arr[][]=new int[m][n];	
    int loc[]=new int[4];  //边界数组
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			arr[i][j]=scan.nextInt(); //输入
		}
	}	
    loc[0]=-1;    //上边界   注意初始值为-1,处理角落
    loc[1]=m-1;   //下边界
    loc[2]=0;     //左边界
    loc[3]=n-1;   //右边界
    funlow(arr,loc);//向下取数
	}
	private static int funlow(int[][] arr, int loc[]) {
		if(loc[2]==loc[3]) {
			for(int i=++loc[0];i<loc[1];i++) {
				System.out.print(arr[i][loc[2]]+" ");
			}
			System.out.print(arr[loc[1]][loc[2]]);
			return -1;
		}
		loc[0]++;
		for(int i=loc[0];i<=loc[1];i++) {
			System.out.print(arr[i][loc[2]]+" ");
		}
		return funright(arr,loc);//向右取数
	}
	private static int funright(int[][] arr, int loc[]){
		if(loc[0]==loc[1]) {
			for(int i=++loc[2];i<loc[3];i++) {
				System.out.print(arr[loc[1]][i]+" ");
			}
			System.out.print(arr[loc[1]][loc[3]]);
			return -1;
		}
		loc[2]++;
		for(int i=loc[2];i<=loc[3];i++) {
			System.out.print(arr[loc[1]][i]+" ");
		}
		return funhigh(arr,loc);//向上取数
		
	}
	private static int funhigh(int[][] arr, int[] loc) {
		if(loc[2]==loc[3]) {
			for(int i=--loc[1];i>loc[0];i--) {
				System.out.print(arr[i][loc[3]]+" ");
			}
			System.out.print(arr[loc[0]][loc[3]]);
			return -1;
		}
		loc[1]--;
		for(int i=loc[1];i>=loc[0];i--) {
			System.out.print(arr[i][loc[3]]+" ");
		}
		return funleft(arr,loc);//向左取数
	}
	private static int funleft(int[][] arr, int[] loc) {
		if(loc[0]==loc[1]) {
			for(int i=--loc[3];i>loc[2];i--) {
				System.out.print(arr[loc[0]][i]+" ");
			}
			System.out.print(arr[loc[0]][loc[2]]);
			return -1;
		}
		loc[3]--;
		for(int i=loc[3];i>=loc[2];i--) {
			System.out.print(arr[loc[0]][i]+" ");
		}
		return funlow(arr,loc);//向下取数
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CZDXWX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值