C ++中的螺旋矩阵?
Spiral matrix in C++?
我有一个程序,我必须用从 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;
}
}
有几点需要补:
- 你需要围绕你已经拥有的东西进行另一个循环,它会为每一轮螺旋重复你的圆周运动,并在每次迭代中减小圆的大小(这是我示例中的
m
,它被减小接近零)。
- 您在主函数的开头初始化
int i
和 int 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
我有一个程序,我必须用从 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;
}
}
有几点需要补:
- 你需要围绕你已经拥有的东西进行另一个循环,它会为每一轮螺旋重复你的圆周运动,并在每次迭代中减小圆的大小(这是我示例中的
m
,它被减小接近零)。 - 您在主函数的开头初始化
int i
和int 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