蓝桥杯 回形取数 【递归】

版权声明:记笔记~~~ 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

样例输入

扫描二维码关注公众号,回复: 5398808 查看本文章

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 << " ";
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42765557/article/details/87564818