河岸边有三人和三鬼要渡河,鬼也能单独划船,且船上和岸边的鬼的人数不能大于人的个数,否则人就被鬼弄死,问怎么样用java来描述这个成功渡河每步过程 ,还有船上最多只能载两个

解决方案 »

  1.   


    // = =!!
    public class Test {
        public static void main(String[] args) {
            from.gs.add("鬼1");
            from.gs.add("鬼2");
            from.gs.add("鬼3");
            from.ps.add("人1");
            from.ps.add("人2");
            from.ps.add("人3");
            go();
        }
        static Land from = new Land();
        static Land to = new Land();
        static Random r = new Random(System.nanoTime());    enum GO {        End, Left, Rigth
        }    public static void go() {
            GO g = GO.Rigth;
            while ((g = go(g)) != GO.End);
            System.out.println("完成");
        }    public static GO go(GO g) {
            if (g == GO.Rigth) {
                while (true) {
                    switch (r.nextInt(4)) {
                        case 0:
                            if (from.ps.size() > 2 && from.gs.size() <= from.ps.size() - 2) {
                                String s1 = from.ps.remove(r.nextInt(from.ps.size()));
                                String s2 = from.ps.remove(r.nextInt(from.ps.size()));
                                System.out.println("" + from.ps + "," + from.gs + " -" + s1 + "和" + s2 + "-> " + to.ps + "," + to.gs + "");
                                to.ps.add(s1);
                                to.ps.add(s2);
                                if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                    return GO.End;
                                }
                                return GO.Left;
                            }
                            break;
                        case 1:
                        case 2:
                            if (!from.ps.isEmpty() && !from.gs.isEmpty()) {
                                if (from.ps.size() - 1 >= from.gs.size() - 1) {
                                    String s1 = from.ps.remove(r.nextInt(from.ps.size()));
                                    String s2 = from.gs.remove(r.nextInt(from.gs.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " -" + s1 + "和" + s2 + "-> " + to.ps + "," + to.gs + "");
                                    to.ps.add(s1);
                                    to.gs.add(s2);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Left;
                                }
                            }
                            break;
                        case 3:
                            if (from.gs.size() > 1 && to.ps.size() >= to.gs.size() + 1) {
                                String s1 = from.gs.remove(r.nextInt(from.gs.size()));
                                String s2 = from.gs.remove(r.nextInt(from.gs.size()));
                                System.out.println("" + from.ps + "," + from.gs + " -" + s1 + "和" + s2 + "-> " + to.ps + "," + to.gs + "");
                                to.gs.add(s1);
                                to.gs.add(s2);
                                if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                    return GO.End;
                                }
                                return GO.Left;
                            }
                            break;
                    }
                }
            } else {
                while (true) {
                    switch (r.nextInt(2)) {
                        case 0:
                            if (!to.ps.isEmpty() && to.ps.size() - 1 >= to.gs.size()) {
                                String s1 = to.ps.remove(r.nextInt(to.ps.size()));
                                System.out.println("" + from.ps + "," + from.gs + "<-" + s1 + "-" + to.ps + "," + to.gs + "");
                                from.ps.add(s1);
                                if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                    return GO.End;
                                }
                                return GO.Rigth;
                            }
                            break;
                        case 1:
                            if (!to.gs.isEmpty()) {
                                String s1 = to.gs.remove(r.nextInt(to.gs.size()));
                                System.out.println("" + from.ps + "," + from.gs + " <-" + s1 + "- " + to.ps + "," + to.gs + "");
                                from.gs.add(s1);
                                if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                    return GO.End;
                                }
                                return GO.Rigth;
                            }
                            break;
                    }
                }
            }
        }
    }class Land {    List<String> ps = new ArrayList<>();
        List<String> gs = new ArrayList<>();
    }
      

  2.   


    //这次不会错了吧
        public static void main(String[] args) {
            from.gs.add("鬼1");
            from.gs.add("鬼2");
            from.gs.add("鬼3");
            from.ps.add("人1");
            from.ps.add("人2");
            from.ps.add("人3");
            go();
        }
        static Land from = new Land();
        static Land to = new Land();
        static Random r = new Random(System.nanoTime());    enum GO {        End, Left, Rigth
        }    public static void go() {
            GO g = GO.Rigth;
            System.out.println("开始");
            System.out.println("" + from.ps + "," + from.gs + " - - " + to.ps + "," + to.gs);
            while ((g = go(g)) != GO.End);
            System.out.println("完成");
        }    public static GO go(GO g) {
            if (g == GO.Rigth) {
                while (true) {
                    switch (r.nextInt(4)) {
                        case 0:
                        case 1:
                            // - pp ->
                            if (from.ps.size() > 1) {
                                //from没有鬼 || 刚刚有二个人 || 去了二个人后,还是>=鬼的数
                                if (from.gs.size() <= from.ps.size() - 2 || from.ps.size() == 2 || from.gs.isEmpty()) {
                                    String s1 = from.ps.remove(r.nextInt(from.ps.size()));
                                    String s2 = from.ps.remove(r.nextInt(from.ps.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " -" + s1 + "和" + s2 + "-> " + to.ps + "," + to.gs + "");
                                    to.ps.add(s1);
                                    to.ps.add(s2);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Left;
                                }
                            }
                            break;
                        // - pg ->
                        case 2:
                            if (!from.gs.isEmpty() && !from.ps.isEmpty()) {
                                //from 到 to 后,二边人的数都>=鬼数
                                if (to.ps.size() - 1 >= to.gs.size() - 1 && from.ps.size() + 1 >= from.gs.size() + 1) {
                                    String s1 = from.ps.remove(r.nextInt(from.ps.size()));
                                    String s2 = from.gs.remove(r.nextInt(from.gs.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " -" + s1 + "和" + s2 + "-> " + to.ps + "," + to.gs + "");
                                    to.ps.add(s1);
                                    to.gs.add(s2);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Left;
                                }
                            }
                            break;
                        case 3:
                            // - gg ->
                            if (from.gs.size() >= 2) {
                                //to没有人 || from 的人数>=鬼数
                                if ((to.ps.isEmpty() || to.ps.size() >= to.gs.size() + 2)) {
                                    String s1 = from.gs.remove(r.nextInt(from.gs.size()));
                                    String s2 = from.gs.remove(r.nextInt(from.gs.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " -" + s1 + "和" + s2 + "-> " + to.ps + "," + to.gs + "");
                                    to.gs.add(s1);
                                    to.gs.add(s2);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Left;
                                }
                            }
                            break;
                    }
                }
            } else {
                while (true) {
                    switch (r.nextInt(6)) {
                        //<- p -
                        case 0:
                        case 1:
                            if (to.ps.size() >= 1) {
                                if (to.ps.size() - 1 >= to.gs.size() && from.ps.size() + 1 >= from.gs.size()) {
                                    String s1 = to.ps.remove(r.nextInt(to.ps.size()));
                                    System.out.println("" + from.ps + "," + from.gs + "<-" + s1 + "-" + to.ps + "," + to.gs + "");
                                    from.ps.add(s1);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Rigth;
                                }
                            }
                            break;
                        //<- g -
                        case 2:
                            if (to.gs.size() > 0) {
                                if (from.ps.size() >= from.gs.size() + 1 || from.ps.isEmpty()) {
                                    String s1 = to.gs.remove(r.nextInt(to.gs.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " <-" + s1 + "- " + to.ps + "," + to.gs + "");
                                    from.gs.add(s1);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Rigth;
                                }
                            }
                            break;
                        //<- pp -
                        case 3:
                            if (to.ps.size() > 1) {
                                if ((to.ps.size() - 2 >= to.gs.size() && from.ps.size() + 2 >= from.gs.size()) || to.ps.size() == 2 || to.gs.isEmpty()) {
                                    String s1 = to.ps.remove(r.nextInt(to.ps.size()));
                                    String s2 = to.ps.remove(r.nextInt(to.ps.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " <-" + s1 + "," + s2 + "- " + to.ps + "," + to.gs + "");
                                    from.ps.add(s1);
                                    from.ps.add(s2);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Rigth;
                                }
                            }
                            break;
                        //<- gg -
                        case 4:
                            if (to.gs.size() > 1) {
                                if (from.ps.size() >= from.gs.size() + 2  || to.ps.isEmpty()) {
                                    String s1 = to.gs.remove(r.nextInt(to.gs.size()));
                                    String s2 = to.gs.remove(r.nextInt(to.gs.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " <-" + s1 + "," + s2 + "- " + to.ps + "," + to.gs + "");
                                    from.gs.add(s1);
                                    from.gs.add(s2);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Rigth;
                                }
                            }
                            break;
                        //<- pg -
                        case 5:
                            if (!to.gs.isEmpty() && !to.ps.isEmpty()) {
                                if (to.ps.size() - 1 >= to.gs.size() - 1 && from.ps.size() + 1 >= from.gs.size() + 1) {
                                    String s1 = to.ps.remove(r.nextInt(to.ps.size()));
                                    String s2 = to.gs.remove(r.nextInt(to.gs.size()));
                                    System.out.println("" + from.ps + "," + from.gs + " <-" + s1 + "," + s2 + "- " + to.ps + "," + to.gs + "");
                                    from.ps.add(s1);
                                    from.gs.add(s2);
                                    if (from.ps.isEmpty() && from.gs.isEmpty()) {
                                        return GO.End;
                                    }
                                    return GO.Rigth;
                                }
                            }
                            break;
                    }
                }
            }
        }
    }class Land {    List<String> ps = new ArrayList<>();
        List<String> gs = new ArrayList<>();
    }