鉴于其在螺旋上的位置{2 44},找到二维数组中的元素

时间:2017-08-28 09:26:05

标签: c++ matrix

我正在尝试解决一个问题,该问题涉及矩阵元素的螺旋排序以及如何计算相应的行和列。

所有查询都采用SZ P形式,其中SZ是矩阵的大小,P是从中心开始到右上角结束的螺旋位置。
输出必须是螺旋中P点的笛卡尔坐标(行和列)(从底部的第1行和左边的第1列开始)。

我采取的措施是以相反的方式进行,从右上角开始,一直到中心):

while(k <= SZ && l <= SZ && m > 0 && n > 0)
{
right:
    for(int i = k; i <= m; ++i) /// right
    {
        a[i][m] = no;
        --no;
    }
    --m;
down:
    for(int i = m; i >= k; --i) /// down
    {
        a[n][i] = no;
        --no;
    }
    --n;
left:
    for(int i = n; i >= k; --i) /// left
    {
        a[i][k] = no;
        --no;
    }
    ++k;
up:
    for(int i = k; i <= m; ++i) /// up
    {
        a[l][i] = no;
        no--;
    }
    ++l;
    ///where l,k,n,m are:
    /// k start row index
    /// n end row index
    /// l start column index
    /// m end column index
}

代码在3x3矩阵上运行良好,它输出这个矩阵:

3 2 9
4 1 8
5 6 7

所以,我现在想要找到的是如何在矩阵中找到点P的笛卡尔坐标而不将矩阵存储在内存中,因为大小限制为100000。

示例输入:

3 1
3 3
3 9
5 9
5 10

示例输出:

Line = 2, column = 2.
Line = 3, column = 1.
Line = 3, column = 3.
Line = 4, column = 4.
Line = 5, column = 4.

1 个答案:

答案 0 :(得分:0)

略微增加螺旋,出现了一种模式......

 31  30  29  28  27  26
 32  13  12  11  10 (25)
 33  14  03  02 (09) 24
 34  15 (04)[01] 08  23
 35 (16) 05  06  07  22
(36) 17  18  19  20  21

奇数1 ^ 2,3 ^ 2,5 ^ 2的正方形位于面向东北的对角线上,而西西面对角线的偶数正方形。

在任何N ^ 2,(N + 1)^ 2之间也有2N(+1)个元素;前N个位于水平线上,其余位于垂直线上。

将第一项(N = 1)放在x=0, y=0处,第n项的坐标是:

void spiral_to_cartesian(int &x, int &y, int n)
{
    x = 0; y=0;
    if (n <= 1)  return;
    int a = sqrt((double)n);
    int remainder = n - a*a;
    if (a & 1)
    {
       x+=(a/2); y-=(a/2);
       if (remainder > 0 && remainder <= n)
       {
          --y; x-=remainder-1;
       }
       else if (remainder > n)
       {
          x-=n; y+=remainder - n - 1;
       }
    }
    else
    {
       x-=(a/2); y+=(a/2)-1;
       if (remainder > 0 && remainder <= n)
       {
          ++y; x+=remainder-1;
       }
       else if (remainder > n)
       {
          x+=n; y-=remainder - n - 1;
       }
    }
}