- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我写了一个经典的队列填充:
public static void floodFill(int y, int x, byte originalvalue, byte newvalue, byte[][] arr) {
Deque queue = new ArrayDeque();
queue.add(new int[]{y, x});
while (!queue.isEmpty()) {
int[] t = (int[]) queue.poll();
y = t[0];
x = t[1];
if (arr[y][x] == originalvalue) {
arr[y][x] = newvalue;
for (int i = 0; i < 8; i++) {
if (x + dx[i] < arr[0].length && y + dy[i] < arr.length && x + dx[i] > -1 && y + dy[i] > -1 && arr[y + dy[i]][x + dx[i]] == originalvalue) {
queue.add(new int[]{y + dy[i], x + dx[i]});
}
}
}
}
}
现在我想写扫描线Flood Fill,这要快得多。我找不到任何伪代码,我也不明白this code .
你能帮我优化我的洪水填充或写扫描线一吗?
对于尺寸为 1000–2000 x 1000–2000(不一定是正方形)的字节数组,我将这种填充称为一次大面积填充,然后针对较小的区域进行大约 1000 到 1,000,000 次。
最佳答案
这是一种改进的洪水填充算法。不是先填充一个像素再填充它的相邻像素,而是先填充整个水平“运行”的像素然后再填充它的相邻像素。
递归如下:
要填充(X0、X1、Y、旧、新)
:
# Precondition: the segment [X0 X1]/Y has the old color and can't be lengthened
在 Y-1
行中找到所有连接的运行 [X0' X1']
具有旧颜色和 Fill(X0', X1', Y-1 , 旧的, 新的)
在 Y+1
行中找到所有连接的运行 [X0' X1']
具有旧颜色和 Fill(X0', X1', Y+1 , 旧的, 新的)
要在新行中查找所有连接的运行,从 X0
开始,只要您在旧像素上就向左移动,或者只要您在非旧像素上就向右移动(在 X1
处停止);你有 X0'
。然后在旧像素上继续向右;你有 X1'
。只要 X0'
在 [X0 X1]
中,就重复向右搜索。
一些实现细节取决于您选择的 4/8 连接规则。
关于java - 洪水填充扫描线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22719576/
我有一个 3D 数组。在这个数组中,我想找到可以组合成更大元素的元素。矩形不能相互重叠。我最好先找到最大的矩形,但先到先得也不会错,尤其是在提高性能的情况下。 例如 1 0 0 0 1 0 0 0 0
这是使用 D3.js 和 topojson 的洪水 map 示例。 http://bl.ocks.org/cappelaere/6472064 https://gist.github.com/capp
首先声明一下,我不是 DevOp,所以我在 Linux 管理方面的经验有限。 我基本上遵循了这个操作方法 (https://cloud.google.com/monitoring/agent/inst
这不是出于黑客目的。我正在学习计算机科学,我只是好奇。 所以..当主机A向主机B发送TCP SYN时,主机B为接收缓冲区等分配空间,向主机A发送回SYNACK,主机A也分配这样的空间,然后向主机B发送
我正在使用这个插件 https://github.com/mozilla/rust-android-gradle ,这需要我添加 tasks.whenTaskAdded { task -> i
我是一名优秀的程序员,十分优秀!