【问题标题】:Spiral matrix in C++?C ++中的螺旋矩阵?
【发布时间】:2018-01-31 17:27:26
【问题描述】:

我有一个程序,我必须用从 1 到 n 的数字以螺旋形式填充矩阵 a[n][n]。但是我的程序只填充矩阵的边界。我的问题是如何优化算法以使其填充整个二维数组。

#include <iostream>
using namespace std;
void print();
const int n=9;
int a[n][n];
int main()
{
    int counter=1,j=0,i=0;
    for(int i=0; i<n; i++)
    {
        a[i][j]=counter;
        counter++;
    }
    counter--;
    for(int k=0; k<n; k++)
    {

        a[n-1][k]=counter;
        counter++;
    }
    counter--;
    for(int i=n-1; i>=0; i--)
    {
        a[i][n-1]=counter;
        counter++;
    }
    counter--;
    for(int j=n-1; j>0; j--)
    {
        a[i][j]=counter;
        counter++;
    }
    print();
    return 0;
}

void print ()
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {

            cout<<a[i][j]<<'\t';
        }
        cout<<endl;
    }
}

【问题讨论】:

  • 如您所写,您需要 4 个循环,一个用于向左走,一个用于向下,一个用于向右走,一个用于再次向上。但是,您需要跟踪您需要去的地方。例如。第一次向左走,从 0 到 n-1,第二次只从 1 到 n-2,依此类推。我相信你可以做到。

标签: c++ matrix spiral


【解决方案1】:

有几件事需要调整:

  • 您需要围绕已有的内容进行另一个循环,该循环对螺旋的每一轮重复您的圆周运动,并在每次迭代时减小圆圈的大小(这是我的示例中的 m,它减小到零)。
  • 您在 main 函数的开头初始化 int iint j,但在循环中使用 for (int i=0;...),这意味着您没有使用先前定义的整数的值。

最后是这样的:

#include <iostream>

using namespace std;
void print();
const int n=6;
int a[n][n];
int main()
{
    int counter = 1;
    for (int m = n; m > 0; m--)
    {
        int j=n-m,i=0;
        for(i=n-m; i<m; i++)
        {
            a[i][j]=counter;
            counter++;
        }
        counter--;
        for(int k=n-m; k<m; k++)
        {
            a[m-1][k]=counter;
            counter++;
        }
        counter--;
        for(i=m-1; i>=n-m; i--)
        {
            a[i][m-1]=counter;
            counter++;
        }
        counter--;
        for(j=m-1; j>n-m; j--)
        {
            a[n-m][j]=counter;
            counter++;
        }
    }
    print();    
    return 0;
}

使用您的 print() 这会产生:

1       20      19      18      17      16                                                                                     
2       21      32      31      30      15                                                                                     
3       22      33      36      29      14                                                                                     
4       23      34      35      28      13                                                                                     
5       24      25      26      27      12                                                                                     
6       7       8       9       10      11

请注意,我在这里选择了n=6

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多