版权声明:记笔记~~~ https://blog.csdn.net/weixin_42765557/article/details/87564818
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
ways
逆时针,从外圈到里圈一圈一圈的读。 数据结构课老师留过类似的问题 ~
AC代码
#include <iostream>
using namespace std;
int ans[40005],k,a[201][201];
void GetNum(int x,int y,int r,int c)
{
if(r == 0 || c == 0)
return ;
if(r == 1) {
for(int j=0;j<c;j++)
ans[k++] = a[x][y+j];
k--;
return;
}
if(c == 1) {
for(int i=0;i<r;i++)
ans[k++] = a[x+i][y];
k--;
return;//104178617
}
for(int i=0;i<r;i++)
ans[k++] = a[x+i][y];
k--; // 边角处要读两次,这里删去第一次读入
for(int j=0;j<c;j++)
ans[k++] = a[x+r-1][y+j];
k--;
for(int i=r-1;i>=0;i--)
ans[k++] = a[x+i][y+c-1];
k--;
for(int j=c-1;j>=0;j--)
ans[k++] = a[x][y+j];
k--;
GetNum(x+1,y+1,r-2,c-2);
}
int main()
{
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> a[i][j];
k = 1;
GetNum(1,1,n,m);
for(int i=1;i<=m*n;i++) {
cout << ans[i];
if(i != k)
cout << " ";
}
}