我正在尝试编写一个“解圆”的程序。 Circle类包含一个三角形对象的ArrayList和一个整数的ArrayList。每个Triangle对象都有三个int实例字段,这些实例字段表示每个三角形的顶点处的三个数字。还有一个Pairs类(您可以在“代码”部分中看到我拥有的所有代码) 这是一个使用四个三角形的未解决设置示例:
这是“已解决”后的同一个圆圈:
第二张图中的圆是一个已求解的圆,因为圆的任意弧上的数字等于其旁边两个顶点数字的和:6 = 1 + 5,15 = 6 + 9,11 = 7 + 4,而9 = 5 + 4。请注意,这是通过旋转给定的三角形获得的。这在代码中是类似的,只需更改每个三角形在解决方案中存在的对(其中“对”是两个整数的对象,而这些整数是每个三角形在圆上的值)
并非总是以“已解决”状态给出圆。在这种情况下,可以旋转三角形,以使圆处于已求解状态。任何给定圆的先决条件是存在已解决状态,因此数字始终会对齐。
一个圆将始终至少包含两个三角形,并且没有(实际)最大数目。每个给定的圆始终都是可解的,这意味着有一种旋转每个三角形的方法,这样圆上的数字就是来自两个不同三角形的两个相邻顶点之和的结果。
程序的重点是不更改任何给定的实例字段;相反,我只想创建一个称为resolveCircle的方法,该方法返回成对的ArrayList,它们表示Circle的解决方案。在上面的示例中,solveCircle方法将返回一个包含以下对的ArrayList:(4,1),(5,6),(9,7),(4,5)。这些对在解决方案中,因为它们都是三角形上的所有数字对,每对也都在圆上。请注意,解决方案沿圆圈逆时针旋转。
我的直觉告诉我,此过程应涉及某种类型的递归,因为由于圆的圆形性质,所以循环很棘手;换句话说,我可以遍历每对三角形找到合适的解决方案,但是很容易存在多个,并且将每个解决方案与下一个和解进行比较似乎效率不高。递归似乎是一个更好的选择,但我不确定将递归应用于...应该使用什么算法,甚至是基本情况?
public class Triangle
{
private int num1;
private int num2;
private int num3;
public Triangle(int n1, int n2, int n3)
{
num1 = n1;
num2 = n2;
num3 = n3;
}
public ArrayList<Pair> getPairs()
{
ArrayList<Pair> pairs = new ArrayList<Pair>();
pairs.add(new Pair(num1, num2));
pairs.add(new Pair(num2, num3));
pairs.add(new Pair(num3, num1));
return pairs;
}
}
class Pair
{
private int p1;
private int p2;
public Pair(int x, int y)
{
p1 = x;
p2 = y;
}
}
public class Circle
{
private ArrayList<Triangle> triangles;
private ArrayList<Integer> sums;
public Wheel(ArrayList<Integer> s, ArrayList<Triangle> t)
{
triangles = t;
sums = s;
}
public ArrayList<Pair> solveCircle()
{
//need help here
}
}
答案 0 :(得分:0)
您可以使用tree将已求解的三角形与未求解的三角形分开。对于已解决和未解决的圈子也是如此。这样,您可以将其设为log n
搜索功能,该功能将忽略已解决的功能,从而避免不必要的比较。
if (solved)
add to left side of the tree
else
add to right side of the tree
根据使用情况,其复杂性也可能是一种极端的矫kill过正。
答案 1 :(得分:0)
在第一步中,您将调用帮助程序3次:每对调用一次,直到返回成功(布尔值可用来表示成功)。
助手执行递归步骤。
对于递归步骤,您后面有一个和,一个整数必须与之相结合才能达到该和,以及三种可能的方法来实现它……但是,除非递归调用也返回,否则您不会返回成功成功
对于最后一步,不允许进行轮换,因为我完成了后面的总和,所以最终还是对还是错。