Ejemplo n.º 1
0
        private static Position[,] SimulateRound(Position[,] before, int numberWhenPeopleLeave, Func <Position[, ], int, int, int> numberOfAdjacents)
        {
            Position[,] after = before.Clone() as Position[, ];

            for (int i = 0; i < before.GetLength(0); ++i)
            {
                for (int j = 0; j < before.GetLength(1); ++j)
                {
                    if (before[i, j] == Position.Floor)
                    {
                        continue;
                    }

                    int adjacents = numberOfAdjacents(before, i, j);

                    if (adjacents >= numberWhenPeopleLeave)
                    {
                        after[i, j] = Position.Empty;
                    }

                    if (adjacents == 0)
                    {
                        after[i, j] = Position.Occupied;
                    }
                }
            }

            return(after);
        }
Ejemplo n.º 2
0
        private static int CalculateResult1(Position[,] input, int numberWhenPeopleLeave, Func <Position[, ], int, int, int> numberOfAdjacents)
        {
            Position[,] before = input.Clone() as Position[, ];
            Position[,] after  = input.Clone() as Position[, ];

            //Console.WriteLine("start");
            //PrintPosition(before);
            //Console.WriteLine();

            do
            {
                before = after.Clone() as Position[, ];
                after  = SimulateRound(before, numberWhenPeopleLeave, numberOfAdjacents);
                //Console.WriteLine("before");
                //PrintPosition(before);
                //Console.WriteLine("after");
                //PrintPosition(after);
                //Console.WriteLine();
            } while (!PositionsEqual(before, after));

            return(after.Cast <Position>().Count(p => p == Position.Occupied));
        }