示例#1
0
        public bool IsEquivalentTo(EquivalenceNode <T> other)
        {
            var thisRoot  = FindRoot();
            var otherRoot = other.FindRoot();

            return(ReferenceEquals(thisRoot, otherRoot));
        }
示例#2
0
        private EquivalenceNode <T> FindRoot()
        {
            if (_parent == null)
            {
                return(this);
            }

            var root = _parent.FindRoot();

            _parent = root;
            return(root);
        }
示例#3
0
        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);
        }
示例#4
0
 public Wall(EquivalenceNode <Cell> one, EquivalenceNode <Cell> two)
 {
     this.one = one;
     this.two = two;
 }
示例#5
0
        public void MakeEquivalentTo(EquivalenceNode <T> other)
        {
            var root = FindRoot();

            root._parent = other;
        }
示例#6
0
 public EquivalenceNode(T item)
 {
     Item    = item;
     _parent = null;
 }