v.2.0.0 NDameBacktracker implementation

This commit is contained in:
TiiJay
2024-11-29 20:35:48 +01:00
parent b4ee271fff
commit 63626ce9d0
10 changed files with 194 additions and 109 deletions

View File

@@ -0,0 +1,55 @@
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;
};
}

View File

@@ -1,7 +0,0 @@
import { Backtracker } from './backtracker';
describe('Backtracker', () => {
it('should be defined', () => {
expect(new Backtracker()).toBeDefined();
});
});

View File

@@ -1,26 +0,0 @@
import { IBacktracking } from './backtracking.interface';
export class Backtracker {
findSolution = (dataObject: IBacktracking): boolean => {
if (dataObject.solved()) return true;
// nächstes freie Position suchen
dataObject.nextPosition();
dataObject.options().forEach((option) => {
// darf die Option hier eingestellt werden ?
if (dataObject.positionPossible()) {
dataObject.applyPosition();
// Lösung mit dem neu konfigurierten dataObject finden
const solved: boolean = this.findSolution(dataObject);
if (solved) return true;
dataObject.discardPosition();
}
});
return false;
};
}

View File

@@ -1,9 +1,10 @@
import { MatrixPosition } from './matrix-position';
export interface IBacktracking {
options: () => Array<any>;
export interface IBacktrackingModel {
solved: () => boolean;
hasNext: () => boolean;
nextPosition: () => MatrixPosition;
nextPossiblePosition: () => boolean;
positionPossible: () => boolean;
applyPosition: () => MatrixPosition;
discardPosition: () => MatrixPosition;