首页 > 试题广场 >

发水果

[编程题]发水果
  • 热度指数:1060 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 96M,其他语言192M
  • 算法知识视频讲解
中午是猿辅导水果时间,小猿会给每个同学发水果。猿辅导有一个矩形的办公区域,共有N 排,每排M个工位。平时小猿按照从第一排到最后一排的顺序发水果,某一天小猿突然发现似乎旋转着发水果是一种更有趣的方式,所以决定试试按照逆时针方向螺旋发水果。
已知每个工位有一个数字,表示该工位员工的工号,每个员工的工号不同。已知小猿从(0, 0)位置开始,按照逆时针螺旋的顺序发水果,请输出收到水果的员工工号序列。

输入描述:
第一行 两个数, 数组行列 N,M
接下来 N 行,每行 M 个正整数,表示每个位置的员工工号
1 ≤ N ≤ 1000
1 ≤ M ≤ 1000


输出描述:
发放水果工号序列
示例1

输入

3 3
1 2 3 
4 5 6 
7 8 9

输出

1 4 7 8 9 6 3 2 5
import java.util.*;
 
public class Main{
    public static void main(String[] args){
        Scanner input;
        int N, M, i, j;
        int[][] grid;
         
        input = new Scanner(System.in);
        while(input.hasNext()){
            N = input.nextInt();
            M = input.nextInt();
            grid = new int[N][M];
            for(i = 0; i < N; i++){
                for(j = 0; j < M; j++){
                    grid[i][j] = input.nextInt();
                }
            }
            System.out.println(new Main().Solution(grid, N, M));
        }
    }
     
    private String Solution(int[][] grid, int N, int M){
        int i, j, k, L,delta;
        StringBuilder ans;
        
        ans = new StringBuilder();
        delta = 0;
        while(N > 0 && M > 0){
            if(N == 1 || M == 1)
                L = N + M - 1;
            else
                L = (N + M) * 2 - 4;
            i = 0;
            j = 0;
            for(k = 0; k < L; k++){
                ans.append(grid[i+delta][j+delta]);
                ans.append(" ");
                if(i < N - 1 && j == 0){
                    i++;
                }else if(i == N - 1 && j < M - 1){
                    j++;
                }else if(i > 0 && j == M - 1){
                    i--;
                }else if(i == 0 && j > 0){
                    j--;
                }
            }
            N -= 2;
            M -= 2;
            delta++;
        }
        return ans.toString();
    }
}

编辑于 2019-12-15 11:51:06 回复(0)