Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在给定元素在螺旋上的位置的二维数组中查找元素_C++_Matrix - Fatal编程技术网

C++ 在给定元素在螺旋上的位置的二维数组中查找元素

C++ 在给定元素在螺旋上的位置的二维数组中查找元素,c++,matrix,C++,Matrix,我试图解决一个问题,涉及矩阵元素的螺旋排序以及如何计算相应的行和列 所有查询的形式都是SZ p,其中SZ是矩阵的大小,p是螺旋中从中心开始到右上角结束的位置。 输出必须是螺旋中P点的笛卡尔坐标行和列,从底部的第1行和左侧的第1列开始 我所做的是以相反的方式解决它,从右角开始,一直到中心: while(k <= SZ && l <= SZ && m > 0 && n > 0) { right: for(int i =

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

所有查询的形式都是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.
稍微增大螺旋,出现一种模式

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

你还没有定义“交叉”这个词的含义,你不知道这个词在这里是否正确吗?你的意思是检索螺旋上第N个点的坐标吗?@meowgoesthedog crossing=按照我从1到9绘制的方式遍历矩阵,但我反向操作,因为我觉得更容易。不,我的意思是找到螺旋线的P点。