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