美国地图的四色定理Java实现
我正在尝试为每个状态指定一种颜色,以便没有两个相邻的状态共享相同的颜色()。程序将输出每个状态及其颜色 我正在阅读48个州(2个未连接)的以下格式的文本文件: 例如: 阿拉巴马州与佛罗里达州、密西西比州、田纳西州和乔治亚州接壤 阿肯色州与路易斯安那、德克萨斯等州接壤 这是我目前的代码:美国地图的四色定理Java实现,java,algorithm,Java,Algorithm,我正在尝试为每个状态指定一种颜色,以便没有两个相邻的状态共享相同的颜色()。程序将输出每个状态及其颜色 我正在阅读48个州(2个未连接)的以下格式的文本文件: 例如: 阿拉巴马州与佛罗里达州、密西西比州、田纳西州和乔治亚州接壤 阿肯色州与路易斯安那、德克萨斯等州接壤 这是我目前的代码: MapColor.java import java.io.*; import java.util.*; public class MapColor { public static void
MapColor.java
import java.io.*;
import java.util.*;
public class MapColor {
public static void main(String[] args) throws IOException {
ArrayList <String> statestemp = new ArrayList <String> ();
ArrayList <State> states = new ArrayList <State> ();
// read in each line
BufferedReader reader = new BufferedReader(new FileReader("usa.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
statestemp.add(line);
}
reader.close();
// create all state objects and adjacencies
for (int i = 0; i < statestemp.size(); i++) {
State st = new State();
String[] str = statestemp.get(i).split(",");
st.setName(str[0]);
for (int j = 1; j < str.length; j++) {
st.addAdj(str[j]);
}
states.add(st);
}
// set colors
// print out states and adjacencies
for (State s : states) {
System.out.println("Name: " + s.getName());
System.out.println("Color: " + s.getColor());
System.out.print("Adj: ");
s.getAdj();
System.out.println();
System.out.println();
}
}
}
MapColor.java
导入java.io.*;
导入java.util.*;
公共类MapColor{
公共静态void main(字符串[]args)引发IOException{
ArrayList statemp=新的ArrayList();
ArrayList states=新的ArrayList();
//读每一行
BufferedReader=新的BufferedReader(新的文件阅读器(“usa.txt”);
字符串行=null;
而((line=reader.readLine())!=null){
statestemp.add(行);
}
reader.close();
//创建所有状态对象和邻接
对于(int i=0;i
及
State.java
导入java.util.ArrayList;
公共阶级国家{
公共字符串n=null;
公共int c=0;
public ArrayList adj=新的ArrayList();
公共字符串getName(){
返回n;
}
公共void集合名(字符串名){
这个.n=名称;
}
public int getColor(){
返回c;
}
公共void setColor(int-color){
c=颜色;
}
公共void addAdj(字符串s){
此项修改添加项;
}
公共数组列表getAdj(){
归还这个;
}
}
我正处于我想要开始分配颜色的时候,但我不确定如何进行比较
如有任何建议,将不胜感激 我会把可用的颜色排成一个队列,并在每个状态下迭代分配(即排队/排队)颜色。这是贪婪着色背后的基本思想:。这可能不是最优的,但您只有48个顶点(是的,我认为这是一个图形)。四色映射算法非常复杂,您必须在代码中处理1476个特殊情况。如果您可以多使用一种颜色,那么五色映射算法将满足您的要求,而且更简单,并且有一个 对于美国地图的特殊情况,有许多州的邻居少于五个(例如佛罗里达州),因此您只需解决算法的第一种情况,即:
在本例中,您可以做的是创建State类,以便它能够自行知道周围有多少个状态,以及它们的颜色。通过这种方式,您可以创建一个方法来检查任何相邻状态是否具有相同的颜色(或者该状态是否具有有效的颜色)。这样,您就可以在状态中循环并检查每个状态的颜色是否有效 另外,这将允许您实现一种方法来评估状态应该是哪种颜色,方法是询问所有相邻状态的颜色,然后只为该状态指定任何未返回的颜色。你们可以从我们的一个角落开始,然后以这种方式继续下去
希望这能帮助你解决你的问题 我建议对可能的状态->颜色函数进行深入的搜索。这可能很不正常,但由于输入是静态的,所以输出可以是程序的一部分。因此,您可以通过从现有文档中提取颜色来解决着色问题:)
MapColor.java
import java.io.*;
import java.util.*;
public class MapColor {
public static void main(String[] args) throws IOException {
ArrayList <String> statestemp = new ArrayList <String> ();
ArrayList <State> states = new ArrayList <State> ();
// read in each line
BufferedReader reader = new BufferedReader(new FileReader("usa.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
statestemp.add(line);
}
reader.close();
// create all state objects and adjacencies
for (int i = 0; i < statestemp.size(); i++) {
State st = new State();
String[] str = statestemp.get(i).split(",");
st.setName(str[0]);
for (int j = 1; j < str.length; j++) {
st.addAdj(str[j]);
}
states.add(st);
}
// set colors
// print out states and adjacencies
for (State s : states) {
System.out.println("Name: " + s.getName());
System.out.println("Color: " + s.getColor());
System.out.print("Adj: ");
s.getAdj();
System.out.println();
System.out.println();
}
}
}
State.java
import java.util.ArrayList;
public class State {
public String n = null;
public int c = 0;
public ArrayList <String> adj = new ArrayList <String> ();
public String getName() {
return n;
}
public void setName(String name) {
this.n = name;
}
public int getColor() {
return c;
}
public void setColor(int color) {
this.c = color;
}
public void addAdj(String s) {
this.adj.add(s);
}
public ArrayList <String> getAdj() {
return this.adj;
}
}