四色定理

时间:2014-09-16 23:42:14

标签: java algorithm recursion

我一直在尝试编写一个代码,该代码将使用四色定理来对由邻接矩阵定义的区域进行着色。邻接矩阵看起来像:

    A B C D

A   0 1 0 1
B   1 0 1 0
C   0 1 0 1
D   1 0 1 0

因此,对于此示例,A与其自身或C不相邻,但它与B和D相邻。

我写的程序必须使用递归和回溯来为定义的区域分配4种颜色(或更少)。

到目前为止,我的算法如下:

global int[] colors = <region one color,region two, region three, region four >
public static int color(row,column)
  if out of bounds ??
    loop(!colored)
    {
      case 1: are any adjacent regions this color? assign
      case 2: are any adjacent regions this color? assign.
      case 3: are any adjacent regions this color? assign.
      case 4: are any adjacent regions this color? assign.
      case 5: if nothing found, steal closest (in #) region's color and call method from there
  }

但我有几个问题:

  1. 这种方法会返回什么?
  2. 这会不会像它应该的那样工作并进行递归/回溯?
  3. 如果给定的行/列超出范围,我会输出什么?
  4. 谢谢!

1 个答案:

答案 0 :(得分:1)

您的伪代码看起来更像local search而不是递归/回溯。逻辑返回值为void,因为本地搜索无法证明没有解决方案,因此通过永久运行来指示失败。 (如果找到,着色本身将通过全局变量返回。)

递归/回溯更像是这样。

boolean extend-coloring(partial-coloring):
    if every vertex has a color, then return true
    let v be a vertex without a color
    for each color c,
        if v has no neighbors of color c,
            apply color c to v in partial-coloring
            if extend-coloring(partial-coloring), then return true
            remove color c from v
    return false

根调用是extend-coloring(empty-coloring),其中empty-coloring没有为顶点指定颜色。返回值表示扩展部分着色的尝试是否成功。