发水果(猿辅导校招笔试题)

[编程题]发水果

时间限制:C/C++ 2秒,其他语言4秒

空间限制:C/C++ 96M,其他语言192M

中午是猿辅导水果时间,小猿会给每个同学发水果。猿辅导有一个矩形的办公区域,共有N 排,每排M个工位。平时小猿按照从第一排到最后一排的顺序发水果,某一天小猿突然发现似乎旋转着发水果是一种更有趣的方式,所以决定试试按照逆时针方向螺旋发水果。
已知每个工位有一个数字,表示该工位员工的工号,每个员工的工号不同。已知小猿从(0, 0)位置开始,按照逆时针螺旋的顺序发水果,请输出收到水果的员工工号序列。

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

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

输入例子1:
3 3
1 2 3 
4 5 6 
7 8 9

输出例子1:
1 4 7 8 9 6 3 2 5思路:此题就是按照逆时针绕正方形形状由外至内来输出正方形边上的员工工号序列。
 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 1010;
 6 
 7 int n, m ,a[N][N];
 8 
 9 
10 int main(){
11     cin >> n >> m;
12 
13     int mm = m , nn = n;
14 
15     for(int i = 0 ; i < n ; i ++)
16         for(int j = 0 ; j < m ; j ++) scanf("%d",&a[i][j]);
17 
18     int sum = n * m;
19     int i = 0 , j = 0;
20     while(sum){
21         for(; i < nn ; i ++){
22             printf("%d ",a[i][j]);
23             sum --;
24             if(sum == 0) return 0;
25         }
26         i --;
27         j ++;
28 
29         for(; j < mm ; j ++){
30             printf("%d ",a[i][j]);
31             sum --;
32             if(sum == 0) return 0;
33         }
34         j --;
35         i --;
36 
37         for(; i >= n - nn ; i --){
38             printf("%d ",a[i][j]);
39             sum --;
40             if(sum == 0) return 0;
41         }
42         i ++;
43         j --;
44 
45         for(; j > m - mm ; j --){
46             printf("%d ",a[i][j]);
47             sum --;
48             if(sum == 0) return 0;
49         }
50         j ++;
51         i ++;
52         mm --;
53         nn --;
54     }
55     return 0;
56 }
View Code