纠正用于回溯图着色算法的Java递归代码

时间:2012-03-18 18:04:37

标签: java recursion graph backtracking

问题是使用递归为给定图形着色,使用最少的颜色,使得没有相邻的顶点可以具有相同的颜色。函数签名是静态字符串穷举(int颜色,字符串前缀)其中颜色是数字在该迭代中使用的颜色和前缀是由每个节点的颜色组成的字符串(例如,如果有3个节点,其中节点0用颜色0着色,节点1用颜色1着色,节点2用颜色2着色;那么前缀将是012)。当所有节点都着色时,该函数返回字符串前缀。第一个调用是使用参数(0,“”)进行的,这意味着尝试使用0颜色着色。 这是我写的代码。它工作正常并返回少于34个节点的正确答案,但是对于大于34,该函数不会返回到主节点。任何改进代码的想法都将受到赞赏。如果需要更多信息,请告诉我。

int n=36;
static int[] lastcolor = new int[n];    
static StringBuilder newprefix ;
String addprefix="";
static int node=0,j=0;
Graph.generateFixedSet(n);
verticies2 =Graph.getVerticies();

public static String exhaustive(int color,String prefix)

 {

    newprefix = new StringBuilder(prefix);

        if(prefix.length()==verticies2.size())
            return prefix;
        else
        {
             for(;j<=color;j++)
            {
                lastcolor[node]=j;

                addprefix = Integer.toString(j);
            canColor =1;
            tempnode = (verticies2.get(node)).getEdges();
                for( h=0;h<tempnode.size();h++)
                {
                     if((tempnode.get(h)).getColor() == j)
                {
                    canColor =0;
                    break;
                }

             }

            if(canColor==1)
                {
                        verticies2.get(node).setColor(j);              
                    node++;
                        j=0;
                newprefix.append(addprefix);
                        break;

                }//end if canColor  
            }//end for

        if(j!= 0)
            {


                if(node==1)
                {                           
                        color++;
                        j=0;
                        node=1;
                newprefix.delete(0,newprefix.length());
                newprefix.append("0");

                }//end if node <=1
                else
                {
                        verticies2.get(node).setColor(-1);
                        node--;
                        j=lastcolor[node]+1;
                        newprefix.setLength(node);
                    }
            }//end if j!=0
            prefix = newprefix.toString();
            return exhaustive(color,prefix);
            }//end else
     }//end exhaustive

1 个答案:

答案 0 :(得分:0)

不要使用递归。如有必要,请使用循环...和arraylists。