use of common.datastore.order.NormalOrder in project solution-finder by knewjade.
the class CheckmateNoHold method search.
@Override
public List<Result> search(Field initField, Piece[] pieces, Candidate<T> candidate, int maxClearLine, int maxDepth) {
Field freeze = initField.freeze(maxClearLine);
int deleteLine = freeze.clearLine();
dataPool.initFirst(new NormalOrder(freeze, null, maxClearLine - deleteLine, maxDepth));
for (int depth = 0; depth < maxDepth; depth++) {
TreeSet<Order> orders = dataPool.getNexts();
dataPool.initEachDepth();
assert depth < pieces.length;
boolean isLast = depth == maxDepth - 1;
for (int count = 0, size = orders.size(); count < size; count++) {
Order order = orders.pollFirst();
searcherCore.stepWithNextNoHold(candidate, pieces[depth], order, isLast);
}
}
return dataPool.getResults();
}
use of common.datastore.order.NormalOrder in project solution-finder by knewjade.
the class CheckmateNoHoldReuse method search.
@Override
public List<Result> search(Field initFieldOrigin, Piece[] pieces, Candidate<T> candidate, int maxClearLine, int maxDepth) {
Field initField = initFieldOrigin.freeze(maxClearLine);
int deleteLine = initField.clearLine();
int height = maxClearLine - deleteLine;
TreeSet<Order> orders = new TreeSet<>();
// 最初の探索開始depthとordersを調整
int startDepth;
if (!equalsField(lastField, initField) || lastPieces == null) {
// mementoの初期化
// 初めから
memento = new ArrayList<>();
orders.add(new NormalOrder(initField, null, height, maxDepth));
startDepth = 0;
memento.add(new TreeSet<>(orders));
} else {
int reuseIndex = -1;
for (int index = 0; index < maxDepth; index++) {
if (lastPieces[index] == pieces[index])
reuseIndex = index;
else
break;
}
if (reuseIndex < 0) {
memento = new ArrayList<>();
orders.add(new NormalOrder(initField, null, height, maxDepth));
startDepth = 0;
memento.add(new TreeSet<>(orders));
} else if (reuseIndex == maxDepth - 1) {
return dataPool.getResults();
} else {
orders.addAll(memento.get(reuseIndex));
startDepth = reuseIndex;
memento = memento.subList(0, reuseIndex + 1);
}
}
dataPool.resetResults();
for (int depth = startDepth; depth < maxDepth; depth++) {
dataPool.initEachDepth();
assert depth < pieces.length;
boolean isLast = depth == maxDepth - 1;
for (int count = 0, size = orders.size(); count < size; count++) {
Order order = orders.pollFirst();
searcherCore.stepWithNextNoHold(candidate, pieces[depth], order, isLast);
}
orders = dataPool.getNexts();
memento.add(new TreeSet<>(orders));
}
lastPieces = pieces;
lastField = initField;
return dataPool.getResults();
}
Aggregations