示例#1
0
 public bool Equals(State otherState)
 {
     return(Graph == otherState.Graph &&
            OnStartingShore.SetEquals(otherState.OnStartingShore) &&
            OnFinishingShore.SetEquals(otherState.OnFinishingShore) &&
            AlcuinNumber == otherState.AlcuinNumber &&
            IsFinishShore == otherState.IsFinishShore);
 }
示例#2
0
        public List <State> GetSuccessors()
        {
            List <State> list = new List <State>();

            if (!IsFinishShore)
            {
                if (!OnStartingShore.Any(s => OnStartingShore.Where(x => s != x).Any(s2 => Graph.ContainEdge(s, s2))))
                {
                    list.Add(new State(Graph, OnStartingShore, OnFinishingShore, AlcuinNumber, !IsFinishShore, this, new[] { "" }));
                }
                for (int i = 0; i < AlcuinNumber; i++)
                {
                    var someCombinations = OnStartingShore.Combinations(i + 1);
                    foreach (var item in someCombinations)
                    {
                        HashSet <string> set1 = new HashSet <string>(OnStartingShore);
                        set1.ExceptWith(item);
                        if (set1.Any(s => set1.Where(x => s != x).Any(s2 => Graph.ContainEdge(s, s2))))
                        {
                            continue;
                        }

                        HashSet <string> set2 = new HashSet <string>(OnFinishingShore);
                        set2.UnionWith(item);
                        list.Add(new State(Graph, set1, set2, AlcuinNumber, !IsFinishShore, this, item.ToArray()));
                    }
                }
            }
            else
            {
                if (!OnFinishingShore.Any(s => OnFinishingShore.Where(x => s != x).Any(s2 => Graph.ContainEdge(s, s2))))
                {
                    list.Add(new State(Graph, OnStartingShore, OnFinishingShore, AlcuinNumber, !IsFinishShore, this, new[] { "" }));
                }
                for (int i = 0; i < AlcuinNumber; i++)
                {
                    var someCombinations = OnFinishingShore.Combinations(i + 1);
                    foreach (var item in someCombinations)
                    {
                        HashSet <string> set1 = new HashSet <string>(OnFinishingShore);
                        set1.ExceptWith(item);
                        if (set1.Any(s => set1.Where(x => s != x).Any(s2 => Graph.ContainEdge(s, s2))))
                        {
                            continue;
                        }

                        HashSet <string> set2 = new HashSet <string>(OnStartingShore);
                        set2.UnionWith(item);
                        list.Add(new State(Graph, set2, set1, AlcuinNumber, !IsFinishShore, this, item.ToArray()));
                    }
                }
            }
            return(list);
        }