c++编程回形取数问题问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式输入第一行是两个不超过200的正整数m,n,

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/09 15:41:40
c++编程回形取数问题问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式输入第一行是两个不超过200的正整数m,n,

c++编程回形取数问题问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式输入第一行是两个不超过200的正整数m,n,
c++编程回形取数问题
问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列.接下来m行每行n个整数,表示这个矩阵.输出格式输出只有一行,共mn个数,为输入矩阵回形取数得到的结果.数之间用一个空格分隔,行末不要有多余的空格.样例输入3 31 2 34 5 67 8 9 样例输出1 4 7 8 9 6 3 2 5 样例输入3 21 23 45 6 样例输出1 3 5 6 4 2 我是初学者,请大神讲讲怎么用循环做,求思路和参考代码,

c++编程回形取数问题问题描述回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式输入第一行是两个不超过200的正整数m,n,
#include <cstdio>

const int MAXM = 200 + 10;
int m, n;
int num[MAXM][MAXM] = {0};
int ans[MAXM*MAXM];
int tempo = 0;

void init()
{
    scanf("%d %d",&m,&n);
    int i, j;
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d",&num[i][j]);
        }
    }
}

void solve(int beginrow, int beginline, int row, int line)
{
    int i, j;
    if (row == 0 || line == 0) return;
    if (row == 1)
    {
        for (i = 0; i < line; i++)
        {
            ans[tempo] = num[beginrow][beginline];
            beginline++;
            tempo++;
        }
        return;
    }
    if (line == 1)
    {
        for (i = 0; i < row; i++)
        {
            ans[tempo] = num[beginrow][beginline];
            beginrow++;
            tempo++;
        }
        return;
    }
    int v = beginrow, h = beginline;
    ans[tempo] = num[beginrow][beginline];
    tempo++;
    for (i = 0; i < row-1; i++)
    {
        v++;
        ans[tempo] = num[v][h];
        tempo++;
    }
    for (i = 0; i < line-1; i++)
    {
        h++;
        ans[tempo] = num[v][h];
        tempo++;
    }
    for (i = 0; i < row-1; i++)
    {
        v--;
        ans[tempo] = num[v][h];
        tempo++;
    }
    for (i = 0; i < line-2; i++)
    {
        h--;
        ans[tempo] = num[v][h];
        tempo++;
    }
    solve(v+1,h,row-2,line-2);
}

void output()
{
    int cnt = n*m;
    if (cnt == 0) return;
    printf("%d",ans[0]);
    for (int i = 1; i < cnt; i++)
    {
        printf(" %d",ans[i]);
    }
    printf("\n");
}

int main()
{
    init();
    int begin1 = m, begin2 = n;
    solve(0,0,begin1, begin2);
    output();
    return 0;
}
璇峰弬鑰?娆㈣繋浜ゆ祦鍝?