v.2.0.0 NDameBacktracker implementation
This commit is contained in:
55
libs/backtracking-lib/src/abstract-backtracker.ts
Normal file
55
libs/backtracking-lib/src/abstract-backtracker.ts
Normal 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;
|
||||
};
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
import { Backtracker } from './backtracker';
|
||||
|
||||
describe('Backtracker', () => {
|
||||
it('should be defined', () => {
|
||||
expect(new Backtracker()).toBeDefined();
|
||||
});
|
||||
});
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user