gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:49:14 25 4
gpt4 key购买 nike

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

所有查询均采用 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 94 1 85 6 7

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

输入示例:

3 13 33 95 95 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

奇数方 block 1^2、3^2、5^2 位于东北对角线上,偶数方 block 位于西南对角线上。

同样在任意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++ - 在给定螺旋位置的二维数组中查找元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45915785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com