目前的问题是,将一张地图分成邻接矩阵中表示的区域,并使用四种颜色对地图进行着色,以确保没有两个相邻区域共享相同的颜色。我们将使用邻接矩阵来编码哪个区域与哪个其他区域相邻。矩阵的列和行是区域,如果两个区域不相邻,则单元格包含0,如果两个区域相邻,则单元格包含1。创建一个递归回溯解决方案,该方案接受用户的交互输入,即地图中的区域数和表示地图组成的邻接矩阵的文件名。
问题是,我遇到的是,第一个值在国家颜色改变,但数组中的许多值永远不会改变。
private static final int[] color = {1,2,3,4};
//this color array is meant to represent 4 colors like red, blue, green, orange etc.
private static int[][] map = {{0,1,1,0,1,1,0},{1,0,0,1,1,0,1},{1,0,0,1,1,1,0},{0,1,1,0,1,0,1},{1,1,1,1,0,0,0},{1,0,1,0,0,0,1},{0,1,0,1,0,1,0}};
//this is the adjacency matrix showing which countries are next to each other
private static int[] countryColor = new int[7];
//this is the array that holds the color values for each country
private static boolean colorMap(int country ){
System.out.println("Checking Country "+ country);
boolean check;
for(int j= 0;j< countryColor.length; j++){
if(useColor(country,color[j]) == true)
countryColor[country] = color[j];
if(country == countryColor.length-1)
return true;
check = colorMap(country+1);
System.out.println(check);
if(check == true)
return true;
countryColor[country]=0;
}
return false;
}
private static boolean useColor(int country, int color){
for(int i = 0; i < map.length;i++){
if(map[country][i] == 1&& countryColor[i]==color){
System.out.println("Nah country " + country +" cant be "+color );
return false;
}
}
return true;
}
您的问题是,如果useColor
返回为false,它不会为当前国家设置颜色,但仍会尝试递归地为地图的其余部分着色。作为一个例子,我们首先尝试用颜色1给第一个国家(国家0)着色,这成功了。然后我们尝试用颜色1给国家1着色,这失败了,因为它与已经有这种颜色的国家0相邻。然后尝试递归地给其余部分着色,如果成功,我们返回true。您应该做的是,如果当前颜色不起作用,那么您应该继续循环的下一次迭代,在递归着色其余颜色之前尝试另一种颜色。
更具体地说,你应该改变
if(useColor(country,color[j]) == true)
countryColor[country] = color[j];
到
if(useColor(country,color[j]) == true)
countryColor[country] = color[j];
else
continue; //this will try and color the current country with another color
我编写了以下程序来递归地实现四色地图定理(简而言之,任何地图只能用4种颜色着色,而没有任何相邻区域是相同的颜色)。一切都在编译,但是我的输出给我错误的数据(每个区域的颜色为-1,而不是现在的值0-3)。我最大的问题是为什么输出不正确。 对于那些想知道的人来说,输入文件是一个邻接矩阵,看起来如下所示: 这是我的代码:
我一直在尝试编写一个代码,将使用四色定理对邻接矩阵定义的区域进行着色。邻接矩阵如下所示: 因此对于这个例子A本身或C不相邻,但它与B和D相邻。 我正在编写的程序必须使用递归和回溯来为定义的区域指定4种颜色(或更少)。 到目前为止我的算法如下: 但我有几个问题: 这个方法会返回什么? 这是否可行,是否应该有递归/回溯? 如果给定的行/列超出边界,我将输出什么? 谢谢你!
我一直在用这个四叉树http://www.astroml.org/book_figures/chapter2/fig_quadtree_example.html 在一些数据上。但是我现在需要结果结构的嵌套表示。 其结构类似于: 这里的子元素是递归元素,它是一个列表,包括进一步的实例。最低深度没有子级(为0),是我想要访问的表示。因此,在这种情况下,我会访问数据 最终,我希望在最低级别的数据表示像:
主要内容:递归的底层实现机制编程语言中,我们习惯将函数(方法)调用自身的过程称为 递归,调用自身的函数称为 递归函数,用递归方式解决问题的算法称为 递归算法。 函数(方法)调用自身的实现方式有 2 种,分别是: 1) 直接调用自身,例如: 2) 间接调用自身,例如: 程序中,function1() 函数内部调用了 function2() 函数,而 function2() 函数内部又调用了 function1() 函数。也就是
程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。 Java 支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。 递归的典型例子是数字的阶乘。数字 N 的阶乘是 1 到 N 之间所有整数的乘积。例如 3 的阶乘就是 1×2×3。下面的程序使用递归来计算数字的阶乘。 该程序产生的输出如下所示: 3的阶乘是 6 4
问题内容: 我的问题是是否有一些调试复杂的递归算法的聪明方法。假设我们有一个复杂的例子(在每个“嵌套迭代”中递归计数器都减少时,这不是简单的情况)。 我的意思是在可能发生循环时类似图的递归遍历。 我需要检查我是否在某处没有无限循环。而且仅使用调试器执行此操作并不能给出肯定的答案(因为我不确定算法是否处于无限循环中,还是只是按需进行处理)。 没有具体的例子很难解释。但是我需要的是… “要检查复杂的递