目前的问题是将地图分成区域,如邻接矩阵和 使用四种颜色,为地图着色,使得没有两个连续区域共享相同的颜色。我们会用的 邻接矩阵,用于编码哪个区域与哪个其他区域接壤。列和行 矩阵是区域,而如果两个区域不相邻,则单元格包含0,如果是,则单元格包含1 边界。创建一个递归回溯解决方案,该解决方案接受来自用户的交互式输入 地图中的区域数量和表示地图构成的邻接矩阵的文件名。
我遇到的问题是countryColor中的第一个值已更改,但数组中的许多值永远不会更改。
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;
}
答案 0 :(得分:1)
您的问题是,如果useColor
返回为false,则不会为当前国家/地区设置颜色,但仍会尝试以递归方式为地图的其余部分着色。例如,我们首先尝试使用颜色1为第一个国家/地区(国家/地区)着色,然后成功。然后,我们尝试使用颜色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