MS油漆代码在采访中询问

时间:2012-03-01 21:42:02

标签: algorithm

我今天接受了采访,被问到这个问题!

编写MS Paint程序。 N * N像素区域。给定像素和颜色,将像素中的颜色更改为所需的颜色,如果相邻的像素颜色相同,也会改变颜色。

我接近它说我将采用一个n * n数组并检查给定的像素并移动到相邻的像素。例如,给定的像素是x,yi首先检查数组中x,y的颜色,然后查找(x + 1,y + 1),(x + 1,y),(x,y + 1) ),(X-1,Y),(X-1,Y-1)...

但面试官不高兴有人能用更好的算法建议我另一种方式......它具有更好的空间和时间复杂性!

3 个答案:

答案 0 :(得分:15)

面试官可能要求进行洪水填充,而这种方法无法用这么简单的方式完成。

如果这是泛光填充,则对角线不算作相邻。

最简单的泛洪填充是对阵列上每个相邻像素的递归调用。在大型网格上使用简单的方法很可能会耗尽堆栈。

正确的方法是将起始位置排队,然后出列,检查像素颜色是否仍为源颜色,并在您前进时扫描左右填充,并将所有像素排列在上方和下方。继续,直到队列耗尽。

答案 1 :(得分:4)

您所谈论的算法称为泛洪填充。 Wikipedia. 讨论了众所周知的方法

答案 2 :(得分:2)

您可以使用 DFS 算法来解决此问题。给定像素(xi,yi),你总是可以构造图形,使得像素节点(xi-1,yi-1),(xi-1,yi),(xi,yi + 1),(xi + 1, yi),(xi + 1,yi-1),(xi + 1,yi + 1),(xi-1,yi + 1)和(xi,yi-1)作为相邻像素节点到(xi,yi) 。 从节点(xi,yi)开始执行 DFS ,为路径中的每个节点着色,并在点击不同的颜色节点后回溯。 DFS具有O(V + E)的良好时间复杂度。