public object Clone() { Futoshiki newFuto = new Futoshiki(_sizeOfProblem); newFuto.Board = new Field[_sizeOfProblem, _sizeOfProblem]; for (int i = 0; i < _sizeOfProblem; i++) { for (int j = 0; j < _sizeOfProblem; j++) { newFuto.Board[i, j] = (Field)Board[i, j].Clone(); } } Domain = new List <int>(_sizeOfProblem); for (int i = 0; i < _sizeOfProblem; i++) { Domain.Add(i + 1); } newFuto.RelationRestrictions = new List <RelationRestriction>(); foreach (RelationRestriction r in RelationRestrictions) { newFuto.RelationRestrictions.Add((RelationRestriction)r.Clone()); } return(newFuto); }
/* * dopuki pola z wartoscia 0 to : * 1. znajdz pole z wartoscia 0 * 2. wybierz co chcesz wpisac * 3. wpisz * 4. sprawdz ograniczenia i poprawnosc * 5a. ok - wpisza na stos * 5b. bad - wpisuj inne wartosci w to miejsce az do skutku, jak dziedzina sie wyczerpie to sciagnij ze stosu kolejna tablice * */ public List <Futoshiki> FutoSolver(Futoshiki problem) { Stack <Field> fields = new Stack <Field>(); Futoshiki solvingProblem; Field field; SearchFieldHeuristic fieldPicker = new SearchFieldHeuristic(ChooseOneByOne); _futoProblemStack.Push(problem); solvingProblem = (Futoshiki)problem.Clone(); field = fieldPicker(solvingProblem.Board); var root = (Field)field.Clone(); root.Value = -1; root.RowNum = -1; root.ColumnNum = -1; fields.Push(root); //fields.Push(field); int valueToSet; int earlierValue = field.Value; while (fields.Any()) { if (field.Value > 0) { earlierValue = field.Value; } valueToSet = PickValueFromDomain(field.Domain, earlierValue); earlierValue = valueToSet; while (valueToSet >= 0 && (!solvingProblem.CheckConstraints(field, valueToSet) || solvingProblem.IsRepetingInRowOrColumn(field, valueToSet))) { earlierValue = valueToSet; valueToSet = PickValueFromDomain(field.Domain, earlierValue); Iterations++; } if (valueToSet > 0) { field = solvingProblem.Board[field.RowNum, field.ColumnNum]; field.Value = valueToSet; fields.Push(field); //Iterations++; if (solvingProblem.CheckIfSolved()) { _solutionsFuto.Add((Futoshiki)solvingProblem.Clone()); //solvingProblem = _futoProblemStack.Pop(); //field = fields.Pop(); } else { _futoProblemStack.Push((Futoshiki)solvingProblem.Clone()); //fields.Push(field); //solvingProblem = (Futoshiki)_futoProblemStack.Pop().Clone(); field = fieldPicker(solvingProblem.Board); earlierValue = 0; } } else { field = fields.Pop(); if (field.Value == -1) { break; } solvingProblem = _futoProblemStack.Pop(); field = solvingProblem.Board[field.RowNum, field.ColumnNum]; //valueToSet = PickValueFromDomain(field.Domain, earlierValue); } } return(_solutionsFuto); }
private Field ChooseByBiggestConstraint(Futoshiki futo) { return(null); }
public Futoshiki FutoSolver(Futoshiki problem) { return(null); }