public bool IsEquivalentTo(EquivalenceNode <T> other) { var thisRoot = FindRoot(); var otherRoot = other.FindRoot(); return(ReferenceEquals(thisRoot, otherRoot)); }
private EquivalenceNode <T> FindRoot() { if (_parent == null) { return(this); } var root = _parent.FindRoot(); _parent = root; return(root); }
public static List <Wall> DoSkyCastle4FMaze(MT19337 rng) { var cells = new EquivalenceNode <Cell> [8, 8]; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (i % 2 == 0 || j % 2 == 0) { cells[j, i] = new EquivalenceNode <Cell>(new Cell(i, j)); } } } var walls = new List <Wall>(); for (int i = 0; i < 8; i += 2) { for (int j = 0; j < 8; j++) { if (j == 7) { walls.Add(new Wall(cells[j, i], cells[0, i])); } else { walls.Add(new Wall(cells[j, i], cells[j + 1, i])); } } } for (int j = 0; j < 8; j += 2) { for (int i = 0; i < 8; i++) { if (i == 7) { walls.Add(new Wall(cells[j, i], cells[j, 0])); } else { walls.Add(new Wall(cells[j, i], cells[j, i + 1])); } } } walls.Shuffle(rng); for (int i = 0; i < walls.Count;) { if (!walls[i].one.IsEquivalentTo(walls[i].two)) { walls[i].one.MakeEquivalentTo(walls[i].two); walls.RemoveAt(i); } else { i++; } } return(walls); }
public Wall(EquivalenceNode <Cell> one, EquivalenceNode <Cell> two) { this.one = one; this.two = two; }
public void MakeEquivalentTo(EquivalenceNode <T> other) { var root = FindRoot(); root._parent = other; }
public EquivalenceNode(T item) { Item = item; _parent = null; }