Exemple #1
0
        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);
 }
Exemple #4
0
 public Futoshiki FutoSolver(Futoshiki problem)
 {
     return(null);
 }