彩色的三角形之谜

时间:2018-12-06 21:29:58

标签: java optimization time graph-theory

我想解决的谜语可以在this video中找到。

如果您无法观看整个视频,请看这里的谜语概述:

enter image description here

简而言之,我需要从连接每一对点的红,蓝线的任何排列中找到能够保证至少有一个单色三角形的最少点数。

下面是我写来解决它的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。不仅我的代码效率低下,而且还很普通。也感谢大家的建议。

0 个答案:

没有答案