(C#) 获取任何类型的 2D 数组 [,] 中的 2 个项目之间的 x 或 y 距离,但不知道任一项目的索引并编辑之间的项目

问题描述 投票:0回答:1

出于学习目的,我问“任何类型”,但实际上我现在正在处理一个

byte[,]
类型数组,它被称为
byteTable
,其内容如下所示:

 00  01  E1  03  04  05

 06  07 (08) 09  0A  0B

 08  0D  0E  0F  10 (08)

 12  13  14  15  04  17

(08) 19 {1A} 1B  1C  1D

 1E  1F  20  10 (08) 23

括号只是为了便于阅读。我想找到数组中唯一的

1A
字节的索引,然后找到从
08
垂直向上方向最近的非唯一
1A
字节值并获取其距离。之后,我需要将中间的所有字节替换为
FF
字节,包括
1A
字节但不包括
08
字节,然后从
0E
所在的字节顺时针重复此操作。

或者,可以不求距离,而是覆盖所有字节,直到从

08
垂直开始顺时针移动,直到到达
1A
字节。哪种方法更可行?

结果应该是这样的:

enter image description here

 00  FF  E1  03  04  05

 06  FF  08  09  0A  0B

 08  FF  FF  FF  FF  08

 12  FF  FF  15  FF  17

 08  FF  FF  FF  FF  1D

 1E  1F  20  10  08  23
c# arrays matrix multidimensional-array
1个回答
0
投票

既然你正在学习,我不会给你完整的解决方案,而是给你一些提示。


您可以使用两个嵌套的 for 循环来查找 1A 值。一个循环在 x 上循环,另一个在 y 上循环。在单独的函数中实现它更容易,因为这样您可以简单地使用

return
语句来停止循环并返回结果。

您可以使用元组返回 x 和 y 索引:

(int x, int y)

参见:元组类型(C# 参考)


您需要一种方法来定义四个基本方向。一种可能的方法是在像这样的元组数组中声明移动方向的 delta x 和 y 值(我正在向下定义正 y 方向。如果您以相反的方式执行此操作,则必须更改

dy
的符号):

//                                 up     right    down    left
(int dx, int dy)[] directions = [(0, -1), (1, 0), (0, 1), (-1, 0)];

然后您可以使用模运算符

%
循环方向来限制索引,如下所示

int direction = 0; // upwards

// In the main loop
(int dx, int dy) = directions[direction];
direction = (direction + 1) % 4;

您可以在主循环中使用此代码来确定方向,并使用嵌套的内循环来执行直线移动。

当到达边界或 08 时,内部循环结束。

当到达边界时(即 x 为 0 或 3 && y 为 0 或 3),主循环结束。

© www.soinside.com 2019 - 2024. All rights reserved.