Thursday, July 25, 2013

UVa 10946 - You want what filled?

UVa Problem

Solution:


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

bool comp_1(const pair<char, int>& a,
      const pair<char, int>& b)
{
   return a.first < b.first;
}

bool comp_2(const pair<char, int>& a,
      const pair<char, int>& b)
{
   return b.second < a.second;
}

class Problem
{
public:
   Problem(const vector<vector<char> >& problemMap) :
      mMap(problemMap)
   {

   }

   vector<pair<char, int> > getSolution() const
   {
      return mHoles;
   }

   void solve()
   {
      for(int iRow = 0; iRow < mMap.size(); ++iRow)
      {
         for(int iCol = 0; iCol < mMap[0].size(); ++iCol)
         {
            if(mVisited.count(make_pair(iRow, iCol)) == 0)
            {
               if(mMap[iRow][iCol] != '.')
               {
                  char character = mMap[iRow][iCol];
                  int holeSize = floodfill(iRow, iCol, character);
                  mHoles.push_back(make_pair(character, holeSize));
               }
            }
         }
      }
      sort(mHoles.begin(), mHoles.end(), comp_1);
      stable_sort(mHoles.begin(), mHoles.end(), comp_2);
   }

private:
   bool valid(int row, int col)
   {
      return row >= 0 && row < mMap.size() &&
            col >= 0 && col < mMap[0].size();
   }
   int floodfill(int row, int col, char c)
   {
      int holeSize = 0;

      if(valid(row, col) && mVisited.count(make_pair(row, col)) == 0)
      {
         if(mMap[row][col] == c)
         {
            ++holeSize;
            mVisited.insert(make_pair(row, col));
            holeSize += floodfill(row+1, col, c);
            holeSize += floodfill(row-1, col, c);
            holeSize += floodfill(row, col+1, c);
            holeSize += floodfill(row, col-1, c);
         }
      }

      return holeSize;

   }
private:
   const vector<vector<char> >& mMap;
   set<pair<int, int> > mVisited;
   vector<pair<char, int> > mHoles;
};

int main(int argc, char *argv[])
{
   int numRows, numCols;
   int iProblem = 1;


   while(cin >> numRows)
   {
      cin >> numCols;

      if(numRows == 0 || numCols == 0)
         break;

      vector<vector<char> > problemMap(numRows);

      for(int iRow = 0; iRow < numRows; ++iRow)
      {
         string strLine;
         cin >> strLine;

         for(int iCol = 0; iCol < numCols; ++iCol)
            problemMap[iRow].push_back(strLine[iCol]);
      }

      Problem prob(problemMap);
      prob.solve();

      vector<pair<char, int> > sol = prob.getSolution();

      cout << "Problem " << iProblem << ":" << endl;

      for(int i = 0; i < sol.size(); ++i)
      {
         cout << sol[i].first << ' ' << sol[i].second << endl;
      }

      ++iProblem;
   }
   return 0;
}

No comments:

Post a Comment