首页 > 解决方案 > 围绕二维数组做一个圆圈

问题描述

我无法在二维数组中转一圈以螺旋形式输出元素。我尝试了这段代码,但它输出的元素不足,我尝试在循环之外创建一些 if 语句以涵盖通用算法不输出的所有情况。你能帮忙提出一些管理正确输出的方法吗?

代码

#include <iostream>  
#include <algorithm>
//#include <cmath>

using namespace std;

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int r, c;
    cin >> r >> c;
    int r_beg = 0, r_end = r - 1, c_beg = 0, c_end = c - 1;

    int **m = new int*[r];

    for (int i = 0; i < r; i++)
    {
        m[i] = new int[c];
        for (int j = 0; j < c; j++)
        {
            cin >> m[i][j];
        }
    }

    for (int runs = min(r, c) / 2; runs--;) {

        for (int i = c_beg; i < c_end; i++)
            cout << m[r_beg][i] << " ";

        for (int i = r_beg; i < r_end; i++)
            cout << m[i][c_end] << " ";

        for (int i = c_end; i > c_beg; i--)
            cout << m[r_end][i] << " ";

        for (int i = r_end; i > r_beg; i--)
            cout << m[i][c_beg] << " ";

        r_beg++;
        c_beg++;
        r_end--;
        c_end--;
    }


    if (r <= c && c_beg <= c_end) {
        for (int i = c_beg; i <= c_end; i++)
            cout << m[r_end][i] << " ";
    }
    else if (r >= c && r_beg <= r_end) {
        for (int i = r_beg; i <= r_end; i++)
            cout << m[i][c_end] << " ";
    }

    for (int i = 0; i < r; i++)
        delete[] m[i];
    delete[] m;

    return 0;
}

例子:

输入:

3 3
1 2 3
4 5 6
7 8 9

输出:1 2 3 6 9 8 7 4 5

例如,如果您有 3x10 矩阵。它不输出。

输入:

3 

7

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21

输出:应该达到 13,但在 8 处停止。

标签: c++

解决方案


如图所示,代码向中心循环,直到两个维度中较小的一个被耗尽。但是,如果该较小尺寸具有奇数尺寸,则中心行或列的部分分别没有被打印出来。你可以在你的外循环之后用一些特殊情况处理来覆盖那个:

for (int runs = std::min(r, c) / 2; runs--;)
{
    // ...
}

if(c < r)
{
    if(c & 1)
    {
        for (int i = r_beg; i <= r_end; i++)
        //                     ^ (!)
        // don't forget to print last element: there's no second loop
        // that would print the corner element a second time now!
            std::cout << m[i][c_end] << " ";
    }
}
else
{
    // handles the square matrix case as well

    if(r & 1)
    {
        for (int i = c_beg; i <= c_end; i++)
            std::cout << m[r_beg][i] << " ";
    }
}

推荐阅读