Java 蓝桥杯 回形取数

问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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++;
		}
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值