java 色三角形谜语

3bygqnnd  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(318)

我想解开的谜团可以在这段视频中找到。
如果你无法观看整个视频,下面是谜语的概要:

简言之,我需要找到最小数量的点,其中有保证至少有一个单一的颜色三角形从任何安排的红色和蓝色线连接每一对点。
下面是我为解决这个问题而编写的java程序。

public class RedBlueTimeTravelProblem {

    public static void main(String[] args) {
        int max = 3;
        boolean alltri = false;
        long start, end;
        double time;

        while (!alltri) {
            start = System.nanoTime();

            int edgecount = max * (max - 1) / 2;
            int combos = (int) Math.pow(2, edgecount);
            alltri = false;

            for (int i=1; i<=combos; i++) {
                int a = i-1;
                int[][] edge = new int[edgecount][3];

                for (int j=0; j<edgecount; j++) {
                    edge[j][2] = a % 2;
                    a = (a - a % 2) / 2;
                }

                int c2 = 0;
                for (int j=1; j<=max; j++) {
                    for (int k=j+1; k<=max; k++) {
                        edge[c2][0] = j;
                        edge[c2][1] = k;
                        c2++;
                    }
                }

                boolean tri = false;
                for (int j=0; j<edgecount-2; j++) {
                    for (int k=j+1; k<edgecount-1; k++) {
                        for (int m=k+1; m<edgecount; m++) {
                            if ((edge[j][0] == edge[k][0] && ((edge[j][1] == edge[m][0] && edge[k][1] == edge[m][1]) || (edge[j][1] == edge[m][1] && edge[k][1] == edge[m][0]))) ||
                                    (edge[j][0] == edge[k][1] && ((edge[j][1] == edge[m][0] && edge[k][0] == edge[m][1]) || (edge[j][1] == edge[m][1] && edge[k][0] == edge[m][0]))) ||
                                    (edge[j][0] == edge[m][0] && ((edge[j][1] == edge[k][0] && edge[k][1] == edge[m][1]) || (edge[j][1] == edge[k][1] && edge[k][0] == edge[m][1]))) ||
                                    (edge[j][0] == edge[m][1] && ((edge[j][1] == edge[k][0] && edge[k][1] == edge[m][0]) || (edge[j][1] == edge[k][1] && edge[k][0] == edge[m][0])))) {
                                tri = tri || (edge[j][2] == edge[k][2] && edge[k][2] == edge[m][2]);
                            }
                        }
                    }
                }
                alltri = alltri && tri;
            }
            end = System.nanoTime();
            time = (end - start) / 1000000000.0;
            System.out.println(max + ": " + time + " seconds");
            max++;
        }
        System.out.println("DONE");
    }

}

到目前为止,在检查3点、4点、5点等是否能保证一个单色三角形时,它似乎起到了作用,但它的时间复杂性是荒谬的。例如,以下是3-8分的时间:
3:1.8475e-5秒
4:2.59876e-4秒
5:0.009313668秒
6:0.192455789秒
7:19.226652708秒
根据趋势,8分需要30分钟到1小时,9分大约需要几天,10分需要6个月,还有。。。没人愿意等那么久。
关于如何使我的程序更有效率有什么建议吗?
编辑:显然答案是6。我的代码不仅效率低下,而且完全错了。也谢谢大家的建议。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题