Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
美国地图的四色定理Java实现_Java_Algorithm - Fatal编程技术网

美国地图的四色定理Java实现

美国地图的四色定理Java实现,java,algorithm,Java,Algorithm,我正在尝试为每个状态指定一种颜色,以便没有两个相邻的状态共享相同的颜色()。程序将输出每个状态及其颜色 我正在阅读48个州(2个未连接)的以下格式的文本文件: 例如: 阿拉巴马州与佛罗里达州、密西西比州、田纳西州和乔治亚州接壤 阿肯色州与路易斯安那、德克萨斯等州接壤 这是我目前的代码: MapColor.java import java.io.*; import java.util.*; public class MapColor { public static void

我正在尝试为每个状态指定一种颜色,以便没有两个相邻的状态共享相同的颜色()。程序将输出每个状态及其颜色

我正在阅读48个州(2个未连接)的以下格式的文本文件:

例如:

阿拉巴马州与佛罗里达州、密西西比州、田纳西州和乔治亚州接壤

阿肯色州与路易斯安那、德克萨斯等州接壤

这是我目前的代码:

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;
        }
    }