蓝桥杯——回形取数

该文章介绍了一个Java程序,用于从矩阵中按照回形路径取数。程序首先读取矩阵的行数和列数,然后按顺序取出矩阵边缘的数字,直到所有数字都被取出。当沿着当前方向无法继续取数时,程序会转向90度继续。提供的两个代码示例展示了不同的实现方式。
摘要由CSDN通过智能技术生成

问题描述

  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        int[][] array=new int[m][n];
        int[][] flag=new int[m][n];
        for (int i=0;i<m;i++){
            for (int j=0;j<n;j++){
                array[i][j]=sc.nextInt();
            }
        }
        int i=1,j=0,sum=1;
        flag[0][0]=1;
        System.out.print(array[0][0]);
        while (sum<m*n){

            while (i<m&&flag[i][j]!=1){
                System.out.print(" "+array[i][j]);
                flag[i][j]=1;
                sum++;
                i++;
            }
            i--;j++;
            while (j<n&&flag[i][j]!=1){
                System.out.print(" "+array[i][j]);
                flag[i][j]=1;
                sum++;
                j++;
            }
            j--;
            i--;
            while (i>=0&&flag[i][j]!=1){
                System.out.print(" "+array[i][j]);
                flag[i][j]=1;
                sum++;
                i--;
            }
            i++;
            j--;
            while (j>0&&flag[i][j]!=1){
                System.out.print(" "+array[i][j]);
                flag[i][j]=1;
                sum++;
                j--;
            }
            j++;
            i++;
        }

    }

}

90分的代码,不知道哪里有问题


import java.util.Scanner;


public class Main {
    static int a,b,p=0;
    static  int Mina=-1,Minb=-1,Maxa,Maxb;
    static int[] array2;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        a=sc.nextInt();
        b=sc.nextInt();
        Maxa=a;
        Maxb=b;
        array2=new int[a*b];
        int array[][]=new int[a][b];
        for (int i=0;i<a;i++){
            for (int j=0;j<b;j++){
                array[i][j]=sc.nextInt();
            }
        }
        rounds(array);
            for (int x:array2) {
                System.out.print(x+" ");
            }
    }

    private static void rounds(int[][] array) {
        for (int i=Mina+1;i<Maxa;i++){
            array2[p]=array[i][Minb+1];
            p++;
        }
        for (int i=Minb+2;i<Maxb;i++){
            array2[p]=array[Maxa-1][i];
            p++;
        }
        if (p>=a*b){
            return;
        }
        for (int i=Maxa-2;i>Mina;i--){
            array2[p]=array[i][Maxb-1];
            p++;
        }
        for (int i=Maxb-2;i>Minb+1;i--){
            array2[p]=array[Mina+1][i];
            p++;
        }
        Mina++;
        Minb++;
        Maxa--;
        Maxb--;
        if (Mina==Maxa||Minb==Maxb){
            return;
        }else {
            rounds(array);
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值