コード例 #1
0
        public static bool IsGrounded(this Matrix m)
        {
            var clusters = new CoordClusters();

            for (int y = 0; y < m.R; y++)
            {
                for (int x = 0; x < m.R; x++)
                {
                    for (int z = 0; z < m.R; z++)
                    {
                        if (m[x, y, z] == Voxel.Void)
                        {
                            continue;
                        }
                        clusters.Add(Coord.Of(x, y, z));
                        if (x > 0 && m[x - 1, y, z] == Voxel.Full)
                        {
                            clusters.Unite(Coord.Of(x, y, z), Coord.Of(x - 1, y, z));
                        }
                        if (y > 0 && m[x, y - 1, z] == Voxel.Full)
                        {
                            clusters.Unite(Coord.Of(x, y, z), Coord.Of(x, y - 1, z));
                        }
                        if (z > 0 && m[x, y, z - 1] == Voxel.Full)
                        {
                            clusters.Unite(Coord.Of(x, y, z), Coord.Of(x, y, z - 1));
                        }
                    }
                }
            }

            return(clusters.Count == 1);
        }
コード例 #2
0
ファイル: Planer.cs プロジェクト: cocodrips/icfpc-2018
        private void Inspect()
        {
            mHarmonics = new List <Harmonics>()
            {
                Low
            };

            var clusters = new CoordClusters();

            for (int y = MinY; y <= MaxY; y++)
            {
                for (int x = MinX; x <= MaxX; x++)
                {
                    for (int z = MinZ; z <= MaxZ; z++)
                    {
                        if (S.Matrix[x, y, z] == Voxel.Void)
                        {
                            continue;
                        }
                        Coord c = Coord.Of(x, y, z);
                        clusters.Add(c);
                        if (x > MinX && S.Matrix[x - 1, y, z] == Voxel.Full)
                        {
                            clusters.Unite(c, Coord.Of(x - 1, y, z));
                        }
                        if (y > MinY && S.Matrix[x, y - 1, z] == Voxel.Full)
                        {
                            clusters.Unite(c, Coord.Of(x, y - 1, z));
                        }
                        if (z > MinZ && S.Matrix[x, y, z - 1] == Voxel.Full)
                        {
                            clusters.Unite(c, Coord.Of(x, y, z - 1));
                        }
                    }
                }
                mHarmonics.Add(clusters.Count == 1 ? Low : High);
            }
        }