public bool Equals(State otherState) { return(Graph == otherState.Graph && OnStartingShore.SetEquals(otherState.OnStartingShore) && OnFinishingShore.SetEquals(otherState.OnFinishingShore) && AlcuinNumber == otherState.AlcuinNumber && IsFinishShore == otherState.IsFinishShore); }
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); }