基础练习_回形取数

本文详细解析了蓝桥杯基础练习中的回形取数问题,介绍了一种使用辅助数组避免重复遍历的解决方案,通过四个方向的循环遍历矩阵,实现了对矩阵元素的正确提取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝桥杯_基础练习_回形取数

题目描述

问题

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

问题解决

主要思路

  1. 问题是一个遍历矩阵,我们可以使用一个数组vis[][]来记录矩阵遍历的情况,避免重复遍历。
  2. 按照问题,遍历矩阵方向顺序是。所以我们可以通过四个方向的循环来遍历矩阵。
  3. 比较简单,具体看代码注释把。

代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int m =scanner.nextInt();//行数
		int n = scanner.nextInt();//列数
        //需要遍历的数组
		int[][] a = new int[m+1][n+1];
        //记录遍历情况的数组
		int[][] vis = new int[m+1][n+1];
		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= n; j++) {
				a[i][j]=scanner.nextInt();
			}
		}
        //首先输出第一个元素,来契合我门之后的判断条件
		System.out.print(a[1][1]);
		vis[1][1]=1;//如果这个元素被遍历过,就将此位置置为 1,避免重复遍历
		int sum=1;
		int i=2,j=1;//循环遍历从第一列,第二行开始
        //我们最外围的循环,是控制是否遍历完
		while (sum<n*m) {
            //通过判断条件判断 现在行数是否大于矩阵行数 以及 这个位置是否遍历过
			while (i<=m&&vis[i][j]==0) {
				System.out.print(" "+a[i][j]);
				vis[i][j]=1;
				i++;sum++;
			}
			i--;j++;//单方向遍历完 不减掉 1 ,会发生越界
			while (j<=n&&vis[i][j]==0) {
				System.out.print(" "+a[i][j]);
				vis[i][j]=1;
				j++;sum++;
			}
			j--;i--;
			while (i >= 1&& vis[i][j]==0) {
				System.out.print(" "+a[i][j]);
				vis[i][j]=1;
				i--;sum++;
			}
			i++;j--;
			while (j>=1&&vis[i][j]==0) {
				System.out.print(" "+a[i][j]);
				vis[i][j]=1;
				j--;sum++;
			}
			j++;i++;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值