Java 四色定理

Java 四色定理,java,algorithm,recursion,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

我一直在尝试编写一个代码,使用四色定理对邻接矩阵定义的区域进行着色。邻接矩阵如下所示:

    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
  }
global int[]颜色=
公共静态整型颜色(行、列)
如果超出范围??
循环(!彩色)
{
案例1:是否有任何相邻区域使用此颜色?指定
案例2:是否有任何相邻区域使用此颜色?指定。
案例3:是否有任何相邻区域使用此颜色?指定。
案例4:是否有任何相邻区域使用此颜色?指定。
案例5:如果什么也没找到,偷取最近(在#)区域的颜色并从那里调用方法
}
但我有几个问题:

  • 这个方法会返回什么
  • 这会像它应该的那样工作并具有递归/回溯吗
  • 如果给定的行/列超出边界,我将输出什么

  • 谢谢大家!

    伪代码看起来更像递归/回溯。逻辑返回值将是
    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
    不为顶点指定颜色。返回值表示扩展部分着色的尝试是否成功。

    也许这个问题最好用算法标记,而不是用java标记,或者更适合程序员。se?我对堆栈溢出还是比较陌生,但我的一些问题是专门针对java部分提出的。对于您的代码,它会将每种颜色应用于顶点,然后检查其余颜色是否有效?您是否需要在每一行中扫描邻居的每次呼叫?@NickMireles您的第一个问题是。至于你的第二个,这是一个实现细节。最简单的方法是每次都重新扫描,是的。我不确定,谢谢。我刚刚意识到,我道歉。一旦我完成了代码,我应该把它发布到这里吗?@NickMireles这取决于你。@DavidEisenstat O(n!)