栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何基于坐标对角填充2D数组

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何基于坐标对角填充2D数组

有趣的问题是,如果您只能逐行遍历数组。我将矩形分为三个区域。在 左上部的三角形状 ,在 底部直角三角形中间菱形

对于 左上三角形 ,可以使用通用算术级数计算第一列(x = 0)中的值

1 + 2 + 3 + .. + n =n*(n+1)/2
。该三角形中具有相同x + y值的字段在同一对角线中,并且该值是第一个列+ x的和。

相同的方法适用于 右下三角形
。但是,而不是

x
y
w-x
并且
h-y
被使用,其中,
w
为宽度和
h
矩形的高度。该值必须从
w*h-1
数组中的最大值中减去。

中间菱形
有两种情况。如果矩形的宽度大于(或等于)高度,则矩形的左下角字段是菱形中值最低的字段,可以从之前的总和中计算出

h-1
。从那里开始,您可以想象菱形是一个矩形,其x值为x
x+y
,y值为
y
原始矩形。因此,计算该 新矩形 中的剩余值很容易。
在另一种情况下,当高度大于宽度时,则可以使用该算术和求和处的场,
x=w-1
并且
y=0
菱形可以想象为具有x值
x
和y值的矩形
y-(w-x-1)


例如,可以通过预先计算值来优化代码。我认为对于所有这些情况也有一个公式。也许以后再考虑。

inline static int diagonalvalue(int x, int y, int w, int h) {    if (h > x+y+1 && w > x+y+1) {        // top/left triangle        return ((x+y)*(x+y+1)/2) + x;    } else if (y+x >= h && y+x >= w) {        // bottom/right triangle        return w*h - (((w-x-1)+(h-y-1))*((w-x-1)+(h-y-1)+1)/2) - (w-x-1) - 1;    }    // rhomboid in the middle    if (w >= h) {        return (h*(h+1)/2) + ((x+y+1)-h)*h - y - 1;    }    return (w*(w+1)/2) + ((x+y)-w)*w + x;}

for (y=0; y<h; y++) {    for (x=0; x<w; x++) {        array[x][y] = diagonalvalue(x,y,w,h);    }}

当然,如果没有这样的限制,类似的东西应该会更快一些:

n = w*h;x = 0;y = 0;for (i=0; i<n; i++) {    array[x][y] = i;    if (y <= 0 || x+1 >= w)  {        y = x+y+1;        if (y >= h) { x = (y-h)+1; y -= x;        } else { x = 0;        }    } else {        x++;        y--;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415705.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号