红警2突然崩溃思考―地图?(最短,最长节点/路径)

 一直贯彻的理念就是:够用就行。

基本思路,一张图,N个节点,然后画好路径,放入图中,然后按照有向线来深度遍历,最后求最短/最长节点。完全自己从地图上最短的路线来编码的。如果是求路径也就是长度,在下面代码中的graph变量里,将List泛型改为一个聚合类,此类包含下一节点与长度,然后在排序那里排长度就行了。估计迷宫也可以这样求解。红警里面的路径求解怎么算的??难怪部队全选再移动就卡,其一,显卡运算,不停的刷屏;其二,单位移动过程中每移动一个数据点都要进行多个操作判断,记录单位坐标=》清空=》再次运算,内存资源来不及清空时,偶尔会弹出内存地址不可读,这种情况,建议,更新CPU和主板。
 

实例:查找A到I的最少节点路径
package ADT;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
class Node {
    String ID = "";
}
public class Graph {
    private static HashMap<String, List> graph = new java.util.HashMap<String, java.util.List>();
    static java.util.List<Node> getShortPath(Node startN, Node endN) {
        java.util.List<Node> list = graph.get(startN.ID);
        java.util.List<Node> storelist = new java.util.ArrayList<Node>();
        java.util.List<Node> lastlist = new java.util.ArrayList<Node>();
        storelist.add(startN);
        if (list == null || list.isEmpty()) {
            storelist.clear();
            return storelist;
        }
        System.out.print("查找节点:" + startN.ID + ",分别是: ");
        for (Node n : list) {
            System.out.print(n.ID + ">");
        }
        System.out.println();
        for (int i = 0; i < list.size(); i++) {
            Node node = list.get(i);
            if (node.ID.equals(endN.ID)) {//查找到就返回
                //System.out.println("开始节点:" + startN.ID + ";结束节点:" + node.ID + "==" + endN.ID);
                storelist.add(endN);
                return storelist;
            }
            java.util.List<Node> tmplist = getShortPath(node, endN);
            if (lastlist.isEmpty()) {
                lastlist.addAll(tmplist);
                continue;
            }
            if (tmplist.size() <= lastlist.size()) {//在这里查找出最短路径
                if (tmplist.isEmpty()) {
                    continue;
                }
                lastlist.clear();
                lastlist.addAll(tmplist);//堆栈可替换
            }
        }
        storelist.addAll(lastlist);
        return storelist;
    }
    static void insertNode(Node ver, Node sun) {
        if (graph.get(ver.ID) == null) {
            //如果没有节点情况,于是乎插入节点
            //System.out.println("插入节点:" + ver.ID + ">" + sun.ID);
            java.util.List<Node> nodes = new java.util.ArrayList<Node>();
            nodes.add(sun);
            graph.put(ver.ID, nodes);
            return;
        }
        java.util.List<Node> ls = graph.get(ver.ID);
        ls.add(sun);
        System.out.println("插入节点:" + ver.ID + ">" + sun.ID);
        graph.put(ver.ID, ls);
        return;
    }
 
    public static void main(String str[]) throws Exception {
        //存放数据
        Node na = new Node();
        Node nb = new Node();
        Node nc = new Node();
        Node nd = new Node();
        Node ne = new Node();
        Node nf = new Node();
        Node ng = new Node();
        Node nh = new Node();
        Node ni = new Node();
        na.ID = "A";
        nb.ID = "B";
        nc.ID = "C";
        nd.ID = "D";
        ne.ID = "E";
        nf.ID = "F";
        ng.ID = "G";
        nh.ID = "H";
        ni.ID = "I";
        //insertNode(na, null);
        insertNode(na, ng);
        insertNode(na, nb);
        insertNode(nb, nc);
        insertNode(nb, nd);
        insertNode(nc, ng);
        insertNode(nc, nf);
        insertNode(nd, ne);
        insertNode(ne, nc);
 
        insertNode(nf, nh);
        insertNode(ne, ni);
        insertNode(nh, ni);
 
        java.util.List<Node> list = getShortPath(na, ni);
        for (Node n : list) {
            System.out.print("node:" + n.ID + ">");
        }
    }
}
 
对于一个基本应用来说,可以不用考虑服务器性能问题,现在的服务器不是以前的赛扬了,需要用到算法的应用所需要的环境基本上不存在于租用空间··算法真的是程序员的神兵利器

你可能感兴趣的:(地图,节点路径)