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; }; }