public void typeA(int i, int j, int k) { /* i reflex; use jk */ // System.out.print("\nA "+i+","+j+","+k+":"); // assert(reflex(i), "non reflex i in typeA("+i+","+j+","+k+")"); // assert(k-i > 1, "too small in typeA("+i+","+j+","+k+")"); if (!visible(i, j)) return; int top = j; int w = subD.weight(i, j); if (k - j > 1) { if (!visible(j, k)) return; w += subD.weight(j, k) + 1; } if (j - i > 1) { // check if must use ij, too. PairDeque pair = subD.pairs(i, j); if (!Point.left(sp.p(k), sp.p(j), sp.p(pair.bB()))) { while (pair.more1B() && !Point.left(sp.p(k), sp.p(j), sp.p(pair.underbB()))) pair.popB(); if ((!pair.emptyB()) && !Point.right(sp.p(k), sp.p(i), sp.p(pair.aB()))) top = pair.aB(); else w++; // yes, need ij. top = j already } else w++; // yes, need ij. top = j already } update(i, k, w, top, j); }
public void recoverSolution(int i, int k) { int j; if (guard-- < 0) { // System.out.println("Can't recover" + i + "," + k); return; } if (k - i <= 1) return; PairDeque pair = subD.pairs(i, k); if (reflex(i)) { j = pair.bB(); recoverSolution(j, k); if (j - i > 1) { if (pair.aB() != pair.bB()) { PairDeque pd = subD.pairs(i, j); pd.restore(); while ((!pd.emptyB()) && pair.aB() != pd.aB()) pd.popB(); // assert(!pd.emptyB(), // "emptied pd "+i+","+j+","+k+" "+pair.toString()); } recoverSolution(i, j); } } else { j = pair.aF(); recoverSolution(i, j); if (k - j > 1) { if (pair.aF() != pair.bF()) { PairDeque pd = subD.pairs(j, k); pd.restore(); while ((!pd.empty()) && pair.bF() != pd.bF()) pd.pop(); // assert(!pd.empty(), // "emptied pd "+i+","+j+","+k+" "+pair.toString()); } recoverSolution(j, k); } } }