Java解决算三角形个数的问题

来源:互联网 发布:c语言开发手册 典藏版 编辑:程序博客网 时间:2024/05/17 22:30

原题目是这样的



给这些点分配编号(0~10):




根据点的编号来表达线段,一条线是一个一位数组,全部线是二维数组:


static int[][] liness = new int[][] { { 0, 1, 2 }, { 0, 3, 4, 5 },{ 0, 6, 7, 8 }, { 0, 9, 10 }, { 1, 3, 6, 9 }, { 2, 4, 7, 9 },{ 2, 5, 8, 10 } };


写个判断多个点是否在同一条线的方法:


// 计算多个点是否在同一条线,遍历二维数组,如果其中有一位数组满足包含参数的全部点,则说明参数点都在条线上public static boolean inLine(int... point) {int eq;for (int[] ls : liness) {eq = 0;for (int p : ls) {for (int pp : point) {if (p == pp)eq++;}}if (eq == point.length)return true;}return false;}



写个三角形类,有三个int(点的编号),构造函数里对编号进行排序,覆写equals和hashCode方法,用于过滤重复的三角形


public static class Triangle {private int a, b, c;public Triangle(int... abc) {// 先排序,为了计算的hashCode可比较Arrays.sort(abc);a = abc[0];b = abc[1];c = abc[2];}// 判断三角形是否重复@Overridepublic int hashCode() {return a << 10 + b << 5 + c;}// 来判断三角形是否重复@Overridepublic boolean equals(Object arg0) {Triangle triangle = (Triangle) arg0;return a == triangle.a && b == triangle.b && c == triangle.c;}@Overridepublic String toString() {return "\n[" + a + "," + b + "," + c + "]";}}



最后只需要穷举一下11^3种可能性就行了


public static void main(String[] args) {Set<Triangle> results = new HashSet<Triangle>();for (int a : points) {for (int b : points) {for (int c : points) {// 三个点必须是不同点if (a == b || b == c || a == c)continue;// 三角形的三个点,两两分别在同一直线,三个点不在同一直线if (inLine(a, b) && inLine(c, b) && inLine(a, c)&& !inLine(a, b, c)) {results.add(new Triangle(a, b, c));}}}}// 添加进哈希集,过滤重复项,输出l(results.size(), results);}







完整代码


import java.util.Arrays;import java.util.HashSet;import java.util.Set;public class TriangleProblem {// 先给点分配编号,然后七条线分别用点来表达static int[][] liness = new int[][] { { 0, 1, 2 }, { 0, 3, 4, 5 },{ 0, 6, 7, 8 }, { 0, 9, 10 }, { 1, 3, 6, 9 }, { 2, 4, 7, 9 },{ 2, 5, 8, 10 } };// 题目条件有变动也能马上更改static int[] points = new int[11];static {for (int i = 0; i < points.length; i++)points[i] = i;}public static void main(String[] args) {Set<Triangle> results = new HashSet<Triangle>();for (int a : points) {for (int b : points) {for (int c : points) {// 三个点必须是不同点if (a == b || b == c || a == c)continue;// 三角形的三个点,两两分别在同一直线,三个点不在同一直线if (inLine(a, b) && inLine(c, b) && inLine(a, c)&& !inLine(a, b, c)) {results.add(new Triangle(a, b, c));}}}}// 添加进哈希集,过滤重复项,输出l(results.size(), results);}// 计算多个点是否在同一条线,遍历二维数组,如果其中有一位数组满足包含参数的全部点,则说明参数点都在条线上public static boolean inLine(int... point) {int eq;for (int[] ls : liness) {eq = 0;for (int p : ls) {for (int pp : point) {if (p == pp)eq++;}}if (eq == point.length)return true;}return false;}public static void l(Object... os) {for (Object o : os)System.err.println(o);}public static class Triangle {private int a, b, c;public Triangle(int... abc) {// 先排序,为了计算的hashCode可比较Arrays.sort(abc);a = abc[0];b = abc[1];c = abc[2];}// 判断三角形是否重复@Overridepublic int hashCode() {return a << 10 + b << 5 + c;}// 来判断三角形是否重复@Overridepublic boolean equals(Object arg0) {Triangle triangle = (Triangle) arg0;return a == triangle.a && b == triangle.b && c == triangle.c;}@Overridepublic String toString() {return "\n[" + a + "," + b + "," + c + "]";}}}


0 0
原创粉丝点击