Exemplo n.º 1
0
    static void process(char[,] map)
    {
        //
        Lake[] lakesRow = new Lake[L];
        for (int j = 0; j < H; j++)
        {
            for (int i = 0; i < L; i++)
            {
                if (map[i, j] == '#')
                {
                    continue;
                }

                //
                bool leftWater = (i > 0) && map[i - 1, j] == 'O';
                bool topWater  = (j > 0) && map[i, j - 1] == 'O';
                //
                if (leftWater && topWater)
                {
                    Lake lakeT = lakesRow[i];
                    Lake lakeL = lakesRow[i - 1];
                    if (lakeT.Serial != lakeL.Serial)
                    {
                        //Merge
                        lakeL.MergeInto(lakeT);
                        //Update
                        for (int x = 0; x < L; x++)
                        {
                            if ((lakesRow[x] != null) && (lakesRow[x].Serial == lakeL.Serial))
                            {
                                lakesRow[x] = lakeT;
                            }
                        }
                    }
                    lakeT.Points.Add(Lake.Index(i, j));
                    continue;
                }
                if (!leftWater && !topWater)
                {
                    //add
                    Lake lake = new Lake();
                    lake.Points.Add(Lake.Index(i, j));
                    Lake.Lakes.Add(lake);
                    lakesRow[i] = lake;
                    continue;
                }
                if (leftWater)
                {
                    lakesRow[i] = lakesRow[i - 1];
                    lakesRow[i].Points.Add(Lake.Index(i, j));
                }
                if (topWater)
                {
                    lakesRow[i].Points.Add(Lake.Index(i, j));
                }
            }
        }
    }