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