当前位置: 代码迷 >> 综合 >> 【猿辅导笔试题】发水果 顺时针打印矩阵
  详细解决方案

【猿辅导笔试题】发水果 顺时针打印矩阵

热度:54   发布时间:2024-02-12 06:02:00.0

中午是猿辅导水果时间,小猿会给每个同学发水果。猿辅导有一个矩形的办公区域,共有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:

1 4 7 8 9 6 3 2 5

思路:通过递归从外到内顺时针打印矩阵,模拟顺时针坐标x和y的变动,依次打印元素。
每次循环完一圈,n和m的范围都要-2,但由于n不一定等于m,递归至内圈时应注意防止越界,将剩余元素输出
使用sum来判断所有的元素是否全部输出

代码:

#include<iostream>
using namespace std;int a[1005][1005];void fun(int n,int m,int x,int y,int sum)
{int i;if(n<0)n=0;    //防止越界if(m<0)m=0;cout<<a[x][y]<<" ";sum--;if(sum==0)return ;for(i=0;i<n-1;i++)		//左 {x++;cout<<a[x][y]<<" ";sum--;if(sum == 0) return ;}for(i=0;i<m-1;i++)		//下 {y++;cout<<a[x][y]<<" ";sum--;if(sum == 0) return ;}for(i=0;i<n-1;i++)		//右 {x--;cout<<a[x][y]<<" ";sum--;if(sum == 0) return ;}for(i=0;i<m-2;i++)		//上 {y--;cout<<a[x][y]<<" ";sum--;if(sum == 0) return ;}fun(n-2,m-2,x+1,y,sum); 
}int main()
{int n,m,i,j;cin>>n>>m;for(i=0;i<n;i++)for(j=0;j<m;j++)cin>>a[i][j];fun(n,m,0,0,n*m);return 0;
}

 

  相关解决方案