【问题标题】:Finding an element in a 2d array given its position on a spiral给定其在螺旋上的位置,在二维数组中查找元素
【发布时间】:2017-08-29 01:46:19
【问题描述】:

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

所有查询的格式为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

示例输出:

行 = 2,列 = 2。
行 = 3,列 = 1。
行 = 3,列 = 3。
行 = 4,列 = 4。
行 = 5,列 = 4。

【问题讨论】:

  • 你还没有定义你所说的“交叉”这个词是什么意思(不知道用在这里是否正确?)你的意思是检索第N个点的坐标在螺旋上?
  • @meowgoesthedog crossing = 以我从 1 到 9 绘制矩阵的方式遍历矩阵,但我反其道而行之,因为我发现它更容易。不,我的意思是找到螺旋的 P(给定点)。

标签: c++ matrix


【解决方案1】:

稍微增强螺旋,出现一个图案……

 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;
       }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2022-11-19
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2014-02-27
    相关资源
    最近更新 更多