University stuff.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

Sequential.java 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. class Sequential extends Oblig4 {
  2. Sequential(NPunkter17 points) {
  3. super(points);
  4. name = "Sequential";
  5. }
  6. @Override
  7. void solve() {
  8. MinMaxXY minmax = findMinMax();
  9. MAX_X = x[minmax.maxX];
  10. MAX_Y = y[minmax.maxY];
  11. IntList indexes = new IntList(n);
  12. for (int i = 0; i < n; ++i)
  13. indexes.add(i);
  14. coHull = pointsRightOf(minmax.maxX, minmax.minX, indexes);
  15. coHull.append(pointsRightOf(minmax.minX, minmax.maxX, indexes));
  16. for (int i = 0; i < coHull.size(); ++i) {
  17. System.out.print(coHull.get(i)+" ");
  18. }
  19. System.out.println("");
  20. }
  21. class MinMaxXY {
  22. int minX, maxX, maxY;
  23. }
  24. MinMaxXY findMinMax() {
  25. int minX = 0;
  26. int maxX = 0;
  27. int maxY = 0;
  28. for (int i = 1; i < n; ++i) {
  29. if (x[i] < x[minX])
  30. minX = i;
  31. if (x[i] > x[maxX])
  32. maxX = i;
  33. if (y[i] > y[maxY])
  34. maxY = i;
  35. }
  36. MinMaxXY minmax = new MinMaxXY();
  37. minmax.minX = minX;
  38. minmax.maxX = maxX;
  39. minmax.maxY = maxY;
  40. return minmax;
  41. }
  42. IntList pointsRightOf(int p1, int p2, IntList indexes) {
  43. int p3 = -1;
  44. double p3dist = 0;
  45. int a = lineA(p1, p2);
  46. int b = lineB(p1, p2);
  47. int c = lineC(p1, p2);
  48. IntList nwIndexes = new IntList();
  49. for (int i = 0; i < indexes.size(); ++i) {
  50. int idx = indexes.get(i);
  51. if (idx == p1 || idx == p2)
  52. continue;
  53. double line = lineEquation(a, b, c, idx);
  54. if (line > 0)
  55. continue;
  56. nwIndexes.add(idx);
  57. double dist = Math.abs(dist(line, a, b));
  58. if (dist > p3dist) {
  59. p3dist = dist;
  60. p3 = idx;
  61. }
  62. }
  63. if (p3 == -1) {
  64. IntList l = addPointsOnLine(nwIndexes, a, b, c, p1);
  65. l.add(p2);
  66. return l;
  67. }
  68. IntList l = pointsRightOf(p1, p3, nwIndexes);
  69. l.append(pointsRightOf(p3, p2, nwIndexes));
  70. return l;
  71. }
  72. }