56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
import { Logger } from '@nestjs/common';
|
|
import { IBacktrackingModel } from './backtracking-model.interface';
|
|
|
|
export abstract class ABacktracker {
|
|
protected readonly logger = new Logger(this.constructor.name);
|
|
|
|
abstract doBacktrack: () => boolean[][];
|
|
|
|
protected findSolution = (dataModel: IBacktrackingModel): boolean => {
|
|
if (dataModel.solved()) return true;
|
|
|
|
// nächstes freie Position suchen
|
|
// const nxtPossPos = dataModel.nextPossiblePosition();
|
|
|
|
while (dataModel.nextPossiblePosition()) {
|
|
dataModel.applyPosition();
|
|
|
|
// Lösung mit dem neu konfigurierten dataObject finden
|
|
const solved: boolean = this.findSolution(dataModel);
|
|
|
|
if (solved) return true;
|
|
|
|
const afterDiscardedPos = dataModel.discardPosition();
|
|
this.logger.debug(`afterDiscardedPos: ${afterDiscardedPos}`);
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
protected ___findSolution___ = (dataModel: IBacktrackingModel): boolean => {
|
|
if (dataModel.solved()) return true;
|
|
|
|
// dataModel.options.forEach((option) => {
|
|
while (dataModel.hasNext()) {
|
|
// nächstes freie Position suchen
|
|
const nxtPos = dataModel.nextPosition();
|
|
this.logger.debug(`nxtPos: ${nxtPos}`);
|
|
|
|
// darf die Option hier eingestellt werden ?
|
|
if (dataModel.positionPossible()) {
|
|
dataModel.applyPosition();
|
|
|
|
// Lösung mit dem neu konfigurierten dataObject finden
|
|
const solved: boolean = this.findSolution(dataModel);
|
|
|
|
if (solved) return true;
|
|
|
|
const afterDiscardedPos = dataModel.discardPosition();
|
|
this.logger.debug(`afterDiscardedPos: ${afterDiscardedPos}`);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|