我的问题是关于方阵。我有一个动态数组,以填充从1到N的数字,从中心开始#39;和螺旋式的。如果我有一个6x6阵列,我需要按照图片中所示的方式填充它。如果我有一个在每个方向上都有偶数个单元格的数组,我需要在我的数组中挑出一个正方形,并开始计算正方形中的第一个元素。但是如果我有一个奇数个单元格的数组,我需要选择一个数组的中心。
我的主要问题是想出一个可以帮助我到达我的中心的算法。 这是我用来创建和打印数组的代码:
views/spree/order_mailer
答案 0 :(得分:1)
nxn
数组的中心是(floor((n-1)/2),floor((n-1)/2))
[0索引]。但我们会以不同的方式解决它。
如果n是偶数,那么它将以
x x x 16
x 1 x x
x x x x
x x x x
x x x x x 36
x x x x x x
x x 1 x x x
x x x x x x
x x x x x x
x x x x x x
因此,对于偶数n,它总是以[0,n-1]结束。 现在你要做什么来填补它?
您知道这些数字是n*n, n*n-1,n*n-2...2,1
。
同样适用于n odd
x x x
x 1 x
9 x x
x x x x x
x x x x x
x x 1 x x
x x x x x
25 x x x x
希望你从这些照片中得到我们想做的事情?
int nc=n*n;
int ans[n][n];
fill ans[][] with -1
int row=n-1,col=0;
if(n&1)
{
while(nc>0)
{
for(int i=row;i>=0 && ans[i][col]==-1;i--)
{
row--;ans[i][col]=nc; nc--;
}
row++;col++;
for(int j=col;j<=n-1 && ans[row][j]==-1;j++)
{
col++;ans[row][j]=nc; nc--;
}
col--;row++;
for(int i=row;i<=n-1 && ans[i][col]==-1;i++)
{
row++;ans[i][col]=nc;nc--;
}
row--;col--;
for(int j=col;j>=0 && ans[row][j]==-1;j--)
{
col--;ans[row][j]=nc;nc--;
}
col++;row--;
}
}
else
{
row=0;col=n-1;
while(nc>0)
{
for(int i=row;i<=n-1 && ans[i][col]==-1;i++)
{
row++;ans[i][col]=nc;nc--;
}
row--;col--;
for(int j=col;j>=0 && ans[row][j]==-1;j--)
{
col--;ans[row][j]=nc;nc--;
}
col++;row--;
for(int i=row;i>=0 && ans[i][col]==-1;i--)
{
row--;ans[i][col]=nc; nc--;
}
row++;col++;db(row);db(col);
for(int j=col;j<=n-1 && ans[row][j]==-1;j++)
{
col++;ans[row][j]=nc; nc--;
}
col--;row++;
}
}
//print ans[n][n]