在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
Finding an element in a 2d array given its position on a spiral
我正在尝试解决一个涉及矩阵元素螺旋排序以及如何计算相应行和列的问题。
所有查询的形式都是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 7 · 3 9 5 9 5 10
示例输出:
行 = 2,列 = 2。 行 = 3,列 = 1。 行 = 3,列 = 3。 行 = 4,列 = 4。 行 = 5,列 = 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;
}
}
}
相关文章:
- 将二维数组的所有元素插入到一维数组中
- 元素在二维数组 c++ 中的出现次数
- 在二维数组中查找第二大元素
- 在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
- 如何为映射和priority_queue编写比较器,其中元素是二维数组
- 如何将 50 行和 50 列的二维数组编码为一个为元素随机分配星号的函数?
- 如何删除二维数组中的元素
- 我无法将二维数组的两个元素的差异分配给C++中其他数组的元素?
- 在 c 和 c++ 中,二维数组的元素是什么类型?
- 如何在默认和二维数组中找到顺序扩大元素的位置
- C++ 中二维数组中未知数量的元素
- 是一个二维数组的名称,它在C++中的第一个元素的地址
- 从二维数组中给定的索引中求对角线元素的和
- 二维数组的最小/最大元素
- 随机修改二维数组元素
- 二维数组:二维数组的子平方的元素之和
- 将二维数组元素复制到另一个具有其他大小的二维数组中
- 如何将元素添加到二维数组/矩阵的随机位置
- C++:用满足特定要求的二维数组的元素制作数组
- 用c++将文件的元素加载到二维数组中