微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解决了在三场比赛中识别序列的错误

如何解决解决了在三场比赛中识别序列的错误

我正在开展一个学校项目,并开发了一个 3 场比赛游戏(基于 Match Masters)。

我在尝试解决有关识别序列并将它们构建为可以处理的形式的机制的错误时遇到了一段时间。

序列的识别是用DFS完成的,然后用不同的方法统计每个序列的大小(现在它以列表的形式返回,每个列表都是一个gem序列,由于其他实现需要采用这种方式,例如确定板上是否有任何可能的匹配项)。

目前存在一个错误:无法识别某些序列。它通常发生在边缘。

以下是相关方法代码

    public Quartet<HashMap<Gem,Gem>,HashMap<Gem,Integer>,AtomicInteger> DFS() {
        HashMap<Gem,Color> color = new HashMap<>();
        HashMap<Gem,Gem> pi = new HashMap<>();
        HashMap<Gem,Integer> d = new HashMap<>();
        HashMap<Gem,Integer> f = new HashMap<>();
        AtomicInteger time = new AtomicInteger();

        Consumer<Gem> DFS_visit = new Consumer<Gem>() {
            @Override
            public void accept(Gem u) {
                color.put(u,Color.GRAY);
                time.getAndIncrement();
                d.put(u,time.intValue());

                for (Gem vertex : u.adj()) {
                    if (color.get(vertex) == Color.WHITE) {
                        pi.put(vertex,u);
                        this.accept(vertex);
                    }
                }
                color.put(u,Color.BLACK);
                f.put(u,time.incrementAndGet());
            }
        };

        for (Gem u : Gem.getAllGems()) {
            color.put(u,Color.WHITE);
            pi.put(u,null);
        }

        for (Gem u : Gem.getAllGems()) {
            if (color.get(u) == Color.WHITE) {
                DFS_visit.accept(u);
            }
        }

        return new Quartet<>(pi,d,f,time);
    }

    private LinkedList<LinkedList<Gem>> sequenceGems(HashMap<Gem,Gem> pi,IntPredicate f) {
        LinkedList<LinkedList<Gem>> gems = new LinkedList<>();
        HashMap<Gem,Integer> lengths = new HashMap<>();
        HashMap<Gem,LinkedList<Gem>> duplicatesHelper = new HashMap<>();

        LinkedList<Gem> gemsToUpdate = new LinkedList<>();
        int length = 0;
        Gem gem = null,ancestor = null;

        for (Gem i : pi.keySet()) {
            gem = i;
            length = 0;

            do {
                gemsToUpdate.push(gem);
                if (pi.get(gem) == null) ancestor = gem;
                gem = pi.get(gem);
                length++;
            } while (gem != null);

            if (!(duplicatesHelper.containsKey(ancestor)) || (length > duplicatesHelper.get(ancestor).size())) { // (!(lengths.containsKey(ancestor)) || (length > lengths.get(ancestor)))
                for (Gem g : gemsToUpdate) {
                    if (duplicatesHelper.containsKey(g)) {
                        int loc = gems.indexOf(duplicatesHelper.get(g));
                        if (loc != -1) gems.remove(loc);
                    }

                    lengths.put(g,length);
                }
            }

            LinkedList<Gem> tmp = (LinkedList<Gem>) gemsToUpdate.clone();
            for (Gem g : gemsToUpdate) {
                duplicatesHelper.put(g,tmp);
            }

            gems.push(tmp);

            gemsToUpdate.clear();
        }

        return gems.stream().filter(i -> f.test(i.size())).collect(Collectors.toCollection(LinkedList::new));
    }

在这里做错了什么?我找不到错误发生的位置。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。